【问题标题】:Microsoft Graph API access token's signature verification is failedMicrosoft Graph API 访问令牌的签名验证失败
【发布时间】:2017-11-26 08:31:27
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: microsoft-graph-api msal


    【解决方案1】:

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

    确保:

    1. 您的 Web API 已配置 OAuth2Permission 范围。看这里。 Configuring a resource application to expose web APIs
    2. 您的客户端应用程序已选择对这些公开 API 的权限。 Configuring a client application to access web APIs
    3. 最后,确保在令牌请求中使用 Web API 的 App ID URI 或 App ID GUID 作为资源值。

    如果这有帮助,请告诉我!

    【讨论】:

    • 感谢您的回答。但是,我有一些新问题:在第 2 步中,我注册的客户端应用程序是一个融合应用程序。它只能从 Microsoft Graph 添加权限,而不能从我的 API 添加权限。如果我带上我的 API 的 App ID URI,我会收到一个错误,即我的客户端的范围不存在。因此,我在 Azure 门户中注册了一个客户端应用程序,在我的 API 应用程序中添加了第 2 步提到的权限,但在第 3 步中,我从 v2.0 端点收到错误:AADSTS70001:此 API 版本不支持应用程序“xxxx”。我正在使用带有 v2.0 端点的 MSAL。是否只支持融合应用客户端?
    • 目前V2应用模型只支持standalone web apis。您可能需要在场景中完全使用 V1 应用模型,这意味着使用 ADAL 和 V1 端点。
    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2018-02-05
    • 1970-01-01
    • 2021-07-30
    • 2021-03-21
    • 2019-07-16
    相关资源
    最近更新 更多