无法验证 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_token 和 id_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:签名验证失败”错误