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

时间:2019-03-19 17:50:37

标签: oauth-2.0 jwt azure-active-directory openid-connect

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

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

名称= MyWebApi

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

登录URL = http://localhost:55000

创建该应用后,我将打开其清单文件,并将 oauth2AllowImplicitFlow false 更改为 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

调用上述网址的响应是:

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,密钥ID:N-lC0n-9DALqwhuHYnHQ63GeCXc”。

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

当我在https://jwt.io/中粘贴MY-ACCESS-TOKEN时,标题为:

{

  "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 的值,或者对于我而言这是否是一个问题。

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

2 个答案:

答案 0 :(得分:2)

我尝试过这一点,效果很好。

请求网址:

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中对其进行了解析并输入了公钥,我得到了结果:

enter image description here

答案 1 :(得分:1)

这里发生的是您收到的令牌是userInfo端点的access_token。观众是图。图的令牌已通过特殊方式进行了修改,因此必须先对令牌进行转换,然后才能验证签名。这样一来,图形就可以将令牌向下游转发(在转换之后),而不必担心会发生转发攻击。

要进行验证,看看是否有“ aud == graph”。