0

我有一个 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;
}

谢谢,

4

1 回答 1

0

如果要获取 API 而不是 Microsoft Graph API 的访问令牌,则必须将 API 指定为resource令牌请求中的 。

确保:

  1. 您的 Web API 已配置 OAuth2Permission 范围。看这里。配置资源应用程序以公开 Web API
  2. 您的客户端应用程序已选择对这些公开 API 的权限。配置客户端应用程序以访问 Web API
  3. 最后,确保使用 Web API 的 App ID URI 或 App ID GUID 作为令牌请求中的资源值。

让我知道这是否有帮助!

于 2017-06-23T04:15:42.143 回答