当前位置: 首页 > 知识库问答 >
问题:

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

张绍晖
2023-03-14

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

我使用 Azure 门户在 Azure AD 中注册了我的应用程序

Name = MyWebApi

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

登录URL=http://localhost:55000

创建此应用程序后,我打开其清单文件并将 oauth2AllowImplicitFlow 从 false 更改为 true。

这就是我在azure portal中为应用程序注册所做的一切。

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

https://login.microsoftonline.com/MY-AD-TENANT-GUID/oauth2/v2.0/authorize?client_id=MY-REGISTERED-APP-GUID

调用上述 URL 的响应为:

http://localhost:55000/#access_token=MY-ACCESS-TOKEN

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

微软。identity model . tokens . securitytokenivalidsignature异常:IDX10511:签名验证失败。尝试键入:“Microsoft。identity model . tokens . x 509 security key,KeyId:N-lC0n-9 dalqwhuhynhq 63 gec xc '。

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

当我粘贴MY-ACCESS-TOKENhttps://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,但我不确定为什么我的令牌头有随机值,或者这在我的情况下是否是一个问题。

知道我在这里做错了什么吗?

共有2个答案

东方英豪
2023-03-14

这里发生的是,您收到的令牌是userInfoendpoint的access_token。观众是图。graph的标记已经以一种特殊的方式进行了修改,因此它们必须在签名生效之前进行转换。这允许graph向下游转发令牌(转换后),而不用担心会发生转发攻击

若要验证,请查看是否“aud == graph”。

高鸿振
2023-03-14

我这边试了这个,效果很好

请求网址:

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中解析它并输入公钥,我得到的结果是:

 类似资料:
  • 我在使用jwt.io验证我的azure广告访问令牌时获得无效签名(在手动检查后将转移到scala代码)。 我正在使用 curl 生成访问令牌: 虽然它为我提供了访问令牌,但响应不包含“Id_token”。不知道为什么。 我正在使用 BEGIN 和 END 证书包装 https://login.microsoftonline.com/common/discovery/keys 中的公钥。(如 htt

  • 文件上说https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html 必须验证访问令牌。如何验证令牌?

  • 我试图使用请求模块向https://accounts.spotify.com/api/token发出POST请求,以便获得访问令牌。我已经用我的Spotify开发帐户注册了重定向URI。这是我的快速<代码>/重定向 路由。 有人能看到这里可能出了什么问题吗?每次我得到的都是一个不伦不类的“哎呀!出了问题”错误页面。

  • 我想做基于令牌的机制,我将有要么温泉或移动应用程序支持多个客户端。 我的web服务引擎和应用程序的用例: 我的web应用程序:客户将注册他们的应用程序,无论是SPA还是移动应用程序。他们将在注册时获得客户id。在SPA或移动应用程序的情况下,只有作为密钥的客户端id会被泄露,因此我只提供客户端id。 Web服务引擎:支持多个客户端,登录客户端各自的应用程序后管理每个用户的会话。 因此,假设有 2

  • 当且仅当用户在发出OAuth2请求时登录到LinkedIn时,它才起作用。 如果用户未登录,则会遇到错误。 我们的行动顺序: 成功获取新的访问令牌 使用访问令牌,发布到apiendpoint 之后,我们将收到一份401,内容如下: 有时,经过一段时间后,使用相同的访问令牌重试会得到200。有时不会。 如果用户在“401期间”登录LinkedIn,那么之前获取的访问令牌就会神奇地开始工作。 我不知道

  • 我试图使用从Spring应用程序中的公共客户端获取访问令牌。 谁能帮我弄清楚我做错了什么吗?