【问题标题】:Cannot validate AAD access token - IDX10511: Signature validation failed无法验证 AAD 访问令牌 - IDX10511:签名验证失败
【发布时间】:2019-11-19 03:17:39
【问题描述】:

我正在尝试构建一种方法来验证我的令牌。我正在使用 Open Id Connect 授权代码流从 Azure Active Directory 检索我的令牌。我得到的令牌是 access_tokenid_token。我正在使用 .NET Core。

我的验证码如下:

string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
var handler = new JwtSecurityTokenHandler();
ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;

try
{
  TokenValidationParameters validationParameters = new TokenValidationParameters
  {
     ValidIssuers = new [] { "https://login.microsoftonline.com/tenantid/v2.0" },
     ValidAudiences = new [] { "client-Id" },
     ValidateAudience = true,
     ValidateIssuer = true,
     IssuerSigningKeys = config.SigningKeys,
     ValidateLifetime = true
  };
  var tokenHandler = new JwtSecurityTokenHandler();
  SecurityToken validatedToken = null;
  tokenHandler.ValidateToken(token.AccessToken, validationParameters, out validatedToken);
  return validatedToken != null;
 }
 catch (SecurityTokenInvalidSignatureException ex)
 {
   return false;
 }
 catch(SecurityTokenValidationException)
 {
   return false;
 }

id_token BUT 下面的代码工作 access_token

不起作用

为 access_token 执行此方法时收到的错误消息是:

IDX10511:签名验证失败。尝试的键:'Microsoft.IdentityModel.Tokens.X509SecurityKey,KeyId:CtAAALb-8NsDe333734859crfOc '。 孩子:'CtAAALb-8NsDe333734859crfOc'。 捕获的异常: ' '

【问题讨论】:

    标签: azure azure-active-directory access-token


    【解决方案1】:

    access_token 受众是您的 API 或 Microsoft Graph/其他第 3 方服务吗?只有验证(您的服务)使用的令牌才有意义,其他受众将自行处理。最重要的是,该 JWT 的签名对您来说可能是不透明的。

    查看更多信息 - https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/issues/812#issuecomment-456700813

    【讨论】:

    • 令牌仅在我自己的服务中存储和使用。我想在收到来自 AAD 的令牌时验证这些。
    • 如果您使用 ADAL/MSAL,则默认情况下会验证颁发者,或者您可以使用 new TokenValidationParameters { ValidAudience = clientId, ValidateIssuer = true }。它很容易测试,捕获一个有效的 access_token,然后使用 curl/Postman 调用您的 API 并修改令牌的签名。更好的是,在你的测试中模拟它。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2019-06-14
    • 1970-01-01
    • 2021-07-30
    • 2017-05-19
    • 2020-11-14
    相关资源
    最近更新 更多