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

M. *_*har 5 oauth-2.0 jwt azure-active-directory openid-connect

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

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

名称 = MyWebApi

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

登录 URL = http://localhost:55000

创建此应用程序后,我打开其清单文件并将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=分段

调用上述 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 core 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"

}
Run Code Online (Sandbox Code Playgroud)

然后我访问此 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-----
Run Code Online (Sandbox Code Playgroud)

我再次收到Invalid Signature

我去过这个线程: https: //github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609,但我不确定为什么我的令牌标头具有随机数值,或者这是否是就我而言,这是否是一个问题。

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

Sun*_*Sun 4

我在我身边尝试过这个,效果很好。

请求网址:

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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述