无法验证 AAD 访问令牌 - IDX10511:签名验证失败

Posted

技术标签:

【中文标题】无法验证 AAD 访问令牌 - IDX10511:签名验证失败【英文标题】:Cannot validate AAD access token - IDX10511: Signature validation failed 【发布时间】: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'。 捕获的异常: ' '

【问题讨论】:

【参考方案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 并修改令牌的签名。更好的是,在你的测试中模拟它。

以上是关于无法验证 AAD 访问令牌 - IDX10511:签名验证失败的主要内容,如果未能解决你的问题,请参考以下文章

使用GraphAPI的AAD令牌无法访问我自己的Rest API?

无法根据访问令牌对用户进行身份验证 - MS Graph API C#

在 Azure Pipelines 中使用托管标识:GetUserAccessToken:无法获取标识的访问令牌。 AAD 返回静默失败

UseJwtBearerAuthentication 失败并显示 IDX10504:无法验证签名,令牌没有签名

Azure AD - 为啥我无法验证 Azure AD 为我的 Web API 颁发的 JWT 令牌?收到“IDX10516:签名验证失败”错误

IDX10501:签名验证失败。无法匹配键