我有一个 Angular 4 站点,我正在尝试使用 Microsoft Graph 隐式流对用户进行身份验证,然后使用令牌在另一个端点调用我们的 API,因此我使用 msal.js 来获取访问令牌。
在我将访问令牌带到我的 API 端点并尝试对其进行验证后,令牌无效。我得到了一个 SignatureVerificationFailedException。
我的理解是访问令牌适用于 Microsoft Graph API,而不是我的 API,因此我无法对其进行验证。(我可以用它来调用 Graph API 没有问题)
如何使用 msal.js 获取可用于我的 API 但不能用于 Microsoft Graph 的访问令牌(不是 id 令牌)?谢谢!
我向 API 端点发送访问令牌而不是 id 令牌的原因是我想从令牌中获取 puid 声明,这对于 id 令牌不可用。
这是我试图验证从使用 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;
}
谢谢,