0
我有一个Angular 4站点,我正在尝试使用Microsoft Graph隐式流来验证用户,然后使用令牌在另一个端点调用我们的API,因此我使用msal.js获取访问令牌。Microsoft Graph API访问令牌的签名验证失败
后,我把访问令牌我的API端点,并尝试有效的话,该令牌可以是无效的。我有一个SignatureVerificationFailedException。
我的理解是,访问令牌是针对微软图形API,而不是我的API,这样我就可以无效的。 (我可以用它来调用Graph API没有问题)
我怎样才能获得一个访问令牌(不是id令牌)使用msal.js可以用于我的API但不是Microsoft Graph?谢谢!
我向API端点发送访问令牌而不是ID令牌的原因是我想从令牌获取puid声明,该令牌不能用于id令牌。
这是我试图有效的访问令牌,我从客户端得到了。如果你想获得一个访问令牌的API,而这是使用msal.js
const string authority = "https://login.microsoftonline.com/common";
const string audience = "https://graph.microsoft.com";
string issuer = null;
string stsDiscoveryEndpoint = $"{authority}/v2.0/.well-known/openid-configuration";
List<SecurityToken> signingTokens = null;
var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
var config = await configManager.GetConfigurationAsync();
issuer = config.Issuer;
signingTokens = config.SigningTokens.ToList();
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidAudience = audience,
ValidIssuer = issuer,
ValidateIssuer = false,
IssuerSigningTokens = signingTokens,
CertificateValidator = X509CertificateValidator.None
};
try
{
// Validate token.
SecurityToken validatedToken = new JwtSecurityToken();
var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters, out validatedToken);
var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;
return ExtractAuthenticatedUserFromClaimsIdentity(claimsIdentity);
}
catch (SignatureVerificationFailedException)
{
throw;
}
感谢,
谢谢你的回答。但是,我遇到了一些新问题:在第2步中,我注册的客户端应用程序是一个融合应用程序。它只能从Microsoft Graph中添加权限,而不能从我的API中添加权限。如果我带上我的API的App ID URI,我得到一个错误,说明该范围对于我的客户端不存在。因此,我在Azure Portal中注册了一个客户端应用程序,并在步骤2中提到了API应用程序的许可权,但在步骤3中,我从v2.0端点获得了一个错误:AADSTS70001:此API版本不支持应用程序“xxxx”。我正在使用v2.0终结点的MSAL。它只支持融合应用程序客户端吗? – up2pixy
眼下V2应用模式只支持[单机Web的API(https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-limitations#restrictions-on-app -types)。可能需要在场景中完全使用V1应用程序模型,这意味着使用ADAL和V1端点。 –