Microsoft Graph API访问令牌的签名验证失败

时间:2017-06-22 21:53:59

标签: microsoft-graph msal

我有一个Angular 4站点,我正在尝试使用Microsoft Graph隐式流来验证用户,然后使用令牌在另一个端点调用我们的API,所以我使用msal.js来获取访问令牌。

在我将访问令牌带到我的API端点并尝试对其进行验证后,该令牌无法生效。我收到了SignatureVerificationFailedException。

我的理解是访问令牌适用于Microsoft Graph API,而不适用于我的API,因此我无法对其进行有效操作。 (我可以用它来调用Graph API而没有问题)

如何使用可用于我的API但不能用于Microsoft Graph的msal.js获取访问令牌(而非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;
}

谢谢,

0 个答案:

没有答案