无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

     2023-03-08     102

关键词:

【中文标题】无法验证从 Azure AD 获得的访问令牌签名以保护 Web API【英文标题】:Unable to validate access token signature obtained from Azure AD in order to secure Web API 【发布时间】:2019-08-10 08:15:09 【问题描述】:

我正在尝试使用隐式流使用 Azure Ad 保护我的 Web api (.net core 2.2)。

我使用 Azure 门户 > Azure Active Directory > 应用程序注册 > 新应用程序注册在 Azure AD 中注册了我的应用程序:

名称 = MyWebApi

应用程序类型 = Web 应用程序/API

登录网址 = http://localhost:55000

创建此应用后,我打开其 Manifest 文件并将 oauth2AllowImplicitFlowfalse 更改为 true

这就是我在 azure 门户中为应用注册所做的一切。

然后我从我的 chrome 浏览器手动调用以下 URL 以获取 access_token:

https://login.microsoftonline.com/MY-AD-TENANT-GUID/oauth2/v2.0/authorize?client_id=MY-REGISTERED-APP-GUID&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%3A55000&scope=openid&response_mode=fragment

调用上述url得到的响应是:

http://localhost:55000/#access_token=MY-ACCESS-TOKEN&token_type=Bearer&expires_in=3600&scope=profile+openid+email+00000003-0000-0000-c000-000000000000%2fUser.Read&session_state=b2be972a-cfbc-49f1-bfc0-6c93f6c87d02

当我将授权标头中的 MY-ACCESS-TOKEN 作为不记名令牌传递给我的 Web API(.net 核心 2.2)时,我收到以下异常:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:IDX10511:签名验证失败。尝试的密钥:'Microsoft.IdentityModel.Tokens.X509SecurityKey,KeyId:N-lC0n-9DALqwhuHYnHQ63GeCXc'。

然后我尝试手动验证签名:

当我将 MY-ACCESS-TOKEN 粘贴到 https://jwt.io/ 时,标题是:



  "typ": "JWT",

  "nonce": "AQABAAAAAACEfexXxjamQb3OeGQ4Gugvm6YdOT-bkA0IPllKMt06-J8If5AQ075TVCav94X_ZYcEYKaPneqdJcqYry-Z4XjX0eMN_fiJX_8wXe9D2b6eRiAA",

  "alg": "RS256",

  "x5t": "N-lC0n-9DALqwhuHYnHQ63GeCXc",

  "kid": "N-lC0n-9DALqwhuHYnHQ63GeCXc"


然后我去这个 URL 获取孩子的公钥:N-lC0n-9DALqwhuHYnHQ63GeCXc

https://login.microsoftonline.com/common/discovery/keys

然后我将以下内容作为公钥粘贴到 jwt.io 上以验证令牌签名:

-----BEGIN CERTIFICATE-----

OBTAINED-PUBLIC-KEY-FROM-THE-ABOVE-URL-HERE

-----END CERTIFICATE-----

我又得到无效签名

我去过这个帖子:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609,但我不确定为什么我的令牌标头有 nonce 值,或者这对我来说是否是个问题。

有什么想法我在这里做错了吗?

【问题讨论】:

我看到您返回的访问令牌还包括 Microsoft Graph API 的范围。我认为这就是 Nonce 也出现的原因......并且当访问令牌意味着对于 Microsoft Graph,您将无法验证它。特别是 00000003-0000-0000-c000-000000000000/User.Read 范围。其中 00000003-0000-0000-c000-000000000000 是 Microsoft Graph API 的资源 ID。 任何想法为什么我得到 Microsoft Graph 的范围?我没有在我的请求中请求它。 在我看来,您应该更改您的应用程序以获取 API 的访问令牌。因为目前你没有指定你想要的 API。您可以将 API 注册为应用程序,对其定义 OAuth 权限,并将权限分配给获取令牌的前端应用程序。 那是最终的计划,但概念还是一样的。我已经为 API 创建了应用程序注册,并且在从 azure AD 获取其访问令牌后尝试访问该 API。问题是我猜与随机数有关,我不确定为什么我的天蓝色广告令牌在我不请求 Microsoft 图形范围时包含随机数。 很高兴看到您已经很清楚注册 API 和您所说的最终计划。另一件需要注意的事情..您从常规 Azure 门户注册了应用程序(因此默认情况下它会接受 v1 令牌)..但是您正在使用 v2 端点来获取令牌..并且您没有指定您想要的 API令牌,端点正在向您返回注册应用程序时静态定义的所有权限的令牌。我认为您的应用注册可能在当前所需权限下选择了Microsoft GraphUser.Read 【参考方案1】:

我试过这个,效果很好。

请求网址:

https://login.microsoftonline.com/tenant-name/oauth2/v2.0/authorize?client_id=application_id&response_type=token&redirect_uri=https://snv2app.azurewebsites.net&scope=api://f3d966c0-517e-4e13-a5bb-9777a916b1a0/User.read openid&response_mode=fragment

当我得到access_token后,我在jwt.io中解析并输入公钥,得到结果:

【讨论】:

Whats api://f3d966c0-517e-4e13-a5bb-9777a916b1a0/User.read 在范围内? api://f3d966c0-517e-4e13-a5bb-9777a916b1a0 是我的api和相关权限。 确实是问题所在,我的作用域不包含 API 的 URI,将其传递到作用域并没有返回 nonce 值,因此我能够验证签名。感谢您的帮助。【参考方案2】:

这里发生的是您收到的令牌是 userInfo 端点的 access_token。观众是图。图的令牌已以特殊方式修改,因此必须在验证签名之前对其进行转换。这允许图将令牌转发到下游(在转换之后),而不必担心会发生转发攻击。

验证是否'aud == graph'。

【讨论】:

我遇到了同样的麻烦,正在使用访问令牌使用 JWT.io 站点对其进行验证,但失败了,您的评论帮助我查看是否可以验证 idToken 并通过验证!但是知道如何验证访问令牌吗?我正在使用 MSAL.js 库,它使用图形范围的参数调用 acquireTokenSilent 来获取访问令牌。那么,这个graph access token有没有办法验证呢? @Maverick 你想对令牌进行什么验证? Graph 将在收到令牌时验证令牌。 我想获取他们所属的用户角色和组 您可以将令牌发送到图形以获取该信息。很难说该令牌中的内容或图形如何使用它。

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

】AzureAD-为啥我无法验证AzureAD为我的WebAPI颁发的JWT令牌?收到“IDX10516:签名验证失败”错误【英文标题】:AzureAD-Whycan\'tIvalidateJWTtokenissuedbyAzureADformyWebAPI?Getting"IDX10516:Signaturevalidationfailed"errorAzureAD-为什么我无法验证AzureA... 查看详情

仅验证从 Azure B2C AD 生成的 JWT 令牌的签名 [重复]

】仅验证从AzureB2CAD生成的JWT令牌的签名[重复]【英文标题】:ValidateonlythesignatureofJWTtokengeneratedfromAzureB2CAD[duplicate]【发布时间】:2018-12-2500:34:12【问题描述】:我只想验证使用AzureB2CAD登录后收到的令牌的签名。网络中显示的示例... 查看详情

从 URL Azure AD 捕获访问令牌以用于令牌

】从URLAzureAD捕获访问令牌以用于令牌【英文标题】:CaptureAccessTokenfromURLAzureADtouseforToken【发布时间】:2021-11-1304:42:55【问题描述】:如果我将我的用户发送到授权端点,他们将返回一个重定向到我指定的URI的URL,其中包含不记... 查看详情

通过 Azure AD 验证不透明的访问令牌

】通过AzureAD验证不透明的访问令牌【英文标题】:validateopaqueaccesstokenbyAzureAD【发布时间】:2022-01-1701:23:54【问题描述】:AzureAD是发出不透明的访问令牌还是只发出JWT令牌?如果是,在这种情况下如何验证不透明的访问令牌?因... 查看详情

验证 Azure AD 令牌签名失败 JAVA

】验证AzureAD令牌签名失败JAVA【英文标题】:ValidatingAzureADTokensignaturefailsJAVA【发布时间】:2017-05-1920:20:24【问题描述】:我正在努力验证AzureAD令牌签名。当我在“jwks_uri”字段中查找正确的键描述时https://login.microsoftonline.com/commo... 查看详情

通过邮递员从 Azure 应用服务验证令牌返回 401

】通过邮递员从Azure应用服务验证令牌返回401【英文标题】:ValidatingtokenfromAzureAppServicethroughpostmanreturns401【发布时间】:2020-05-0616:01:19【问题描述】:我已将我的应用程序与AzureAD身份验证集成。虽然我可以通过相同的方式成功... 查看详情

刷新的 OAuth2 令牌具有无效签名 (Azure AD OAuth2)

...:2018-11-2705:50:24【问题描述】:我正在尝试创建一个身份验证流程,其中用户的访问令牌与刷新令牌一起保存在服务器端会话中,当令牌过期时,如果会话仍然有效,它会被更新。但是,在使用与原始令牌相同的方法进行验证时... 查看详情

验证 Azure 广告访问令牌时签名无效,但 id 令牌有效

】验证Azure广告访问令牌时签名无效,但id令牌有效【英文标题】:InvalidsignaturewhilevalidatingAzureadaccesstoken,butidtokenworks【发布时间】:2018-01-0104:44:43【问题描述】:我在使用jwt.io验证我的azure广告访问令牌时收到无效签名。但是,... 查看详情

ASP.NET Core Azure AD OpenID - 生产服务器上的令牌签名验证失败

】ASP.NETCoreAzureADOpenID-生产服务器上的令牌签名验证失败【英文标题】:ASP.NETCoreAzureADOpenID-TokenSignaturevalidationfailsonproductionserver【发布时间】:2018-01-1716:36:06【问题描述】:我有一个ASP.NETCore1.1项目,使用AzureADOpenID进行身份验证... 查看详情

我们如何在后端验证来自 azure AD 的访问令牌?

】我们如何在后端验证来自azureAD的访问令牌?【英文标题】:HowdowevalidatetheaccesstokenfromazureADinbackend?【发布时间】:2021-12-1717:40:04【问题描述】:我有一个来自azureAD的accessToken。我需要在python中验证它们。我该怎么做?【问题讨... 查看详情

Azure AD Msal 拦截器访问令牌

...间】:2021-12-2802:08:39【问题描述】:我正在使用azureMSAL来验证我的API,但问题是我正在使用DevExtreme自定义存储进行服务器端分页。MsalInterceptor工作并为HttpClient自动生成令牌,但在这种情况下,我不通过h​​ttp发送请求。如果我... 查看详情

Azure AD:访问令牌中缺少角色声明

...需要一个访问令牌来访问受保护的后端。所以我可以同时获得id_token和access_token,并请求此网址:https://login.microsoftonli 查看详情

如何配置 Azure AD 访问令牌的过期时间(使用 ADAL)?

...们使用AzureAD通过用户的Office365帐户向我们的WPF应用程序验证用户身份。这是使用ActiveDirectory身份验证库(ADAL)完成的。目前,每次 查看详情

Azure AD 身份验证令牌未通过 Web api 授权

】AzureAD身份验证令牌未通过Webapi授权【英文标题】:AzureADauthenticationtokenfailswebapiauthorization【发布时间】:2019-10-1422:14:13【问题描述】:我在Azure上有一个需要授权的web-api,我正在使用AzureAD对帐户进行身份验证并生成访问令牌... 查看详情

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

】无法验证AAD访问令牌-IDX10511:签名验证失败【英文标题】:CannotvalidateAADaccesstoken-IDX10511:Signaturevalidationfailed【发布时间】:2019-11-1903:17:39【问题描述】:我正在尝试构建一种方法来验证我的令牌。我正在使用OpenIdConnect授权代... 查看详情

使用刷新令牌 adal azure AD 静默更新访问令牌

...问题描述】:环境Angular5前端使用Adal-Angular进行AzureAD身份验证当前情景用户身份验证成功并获取访问/刷新令牌一段时间后,访问令牌过期。在后续请求中,用户被重定向回Azure登录页面,然后重定 查看详情

JWT 令牌的签名无效 - Azure + Spring Boot

...述】:我正在使用AzureAD对SpringBoot应用程序进行用户身份验证。我创建了一个应用程序来获取登录用户的访问令牌(令牌创建者应用程序)。在此应用程序的“/token”API中,从@RegisteredOAuth2Au 查看详情

适用于 JWT 的 Azure AD 签名密钥

...牌(id令牌)使用非对称密钥进行签名。我看到了公钥来验证元数据文件中的签名是否可用,https://login.microsoftonline.com/common/discovery/keys。但是,我找不到任何有 查看详情