我正在尝试使用隐式流使用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:
调用上述网址的响应是:
当我在授权标头中将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 的值,或者对于我而言这是否是一个问题。
有什么想法我在这里做错了吗?
答案 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中对其进行了解析并输入了公钥,我得到了结果:
答案 1 :(得分:1)
这里发生的是您收到的令牌是userInfo端点的access_token。观众是图。图的令牌已通过特殊方式进行了修改,因此必须先对令牌进行转换,然后才能验证签名。这样一来,图形就可以将令牌向下游转发(在转换之后),而不必担心会发生转发攻击。
要进行验证,看看是否有“ aud == graph”。