【问题标题】:Validating a Microsoft Graph JWT Token验证 Microsoft Graph JWT 令牌
【发布时间】:2021-03-04 20:20:17
【问题描述】:

我绝不是 MSAL/JWT/Graph 身份验证方面的专家,但我希望有人可以更清楚地向我解释这个问题,或者帮助我了解是否有解决方法或更好的方法。

基本上,在某些情况下,我可能最终会使用 Microsoft Graph JWT 令牌。我可以轻松想到的两个示例是使用 Microsoft Graph Toolkit 或在 Microsoft Teams 中使用 Tabs SSO。在这两种情况下,我都可以从我已经拥有的 JWT 令牌(通过 Graph Toolkit 或通过 Teams SSO)获取用户的相关身份信息——他们的 Azure AD 对象 ID 和租户 ID。但是,我不能将相同的令牌用于我自己的后端 API,因为根据我的研究,我无法针对该 JWT 令牌执行基本令牌验证。例如,我希望能够针对该用户和租户 ID 组合存储信息。

我知道我可以进行自己的身份验证(例如 MSAL.js),我什至可以通过扩展其用途来使用 SAME Azure AD 应用程序,但简单地使用我有权访问的令牌会容易得多已经,如果只有一种方法可以验证它。例如,在 Teams 中,SSO 用户体验得到了很好的集成,但我需要让用户通过另一个登录,甚至可能是相同的 Azure AD 应用程序。 [更新:所以从技术上讲,它不是另一个“登录”——用户已经登录,因此是“SSO”,但他们需要再次同意,在这种情况下,他们同意的是同一个应用到刚才]。

那么,我的问题是,是否有任何方法可以安全地验证现有令牌?

【问题讨论】:

  • 嗨@Hilton,我看到这个问题仍然悬而未决,没有任何解决方案。让我带着这个 MS 内部团队,带着解决方案回来。
  • 谢谢,非常感谢

标签: azure-active-directory microsoft-graph-api microsoft-teams azure-ad-graph-api microsoft-graph-toolkit


【解决方案1】:

图表的 AAD 令牌不适用于您的应用/服务,您不应尝试验证甚至解码它。在某些情况下,令牌可能会被加密,从而防止您甚至将其破解。您可以安全地使用 Graph 令牌做的唯一事情是使用它调用 Graph API(只要令牌具有必要的范围)。如果令牌没有必要的范围,那么您将从图表中收到错误消息。

你能帮我更好地理解你的场景吗?你是如何生成这个 Graph 令牌的?通常,当您使用 Tab SSO 时,Teams 生成的令牌不适用于 Graph;它适用于您在 AAD 中注册并在应用清单的 webApplicationInfo 部分中列出的 Web API。要调用下游 Graph API,您需要通过 AAD 的 OBO 流程交换此令牌: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow

如果您的应用未获得必要的同意,则此交换将失败,您可以将其用作触发弹出式身份验证流程并征得用户同意的信号。这记录在这里: https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/authentication/auth-aad-sso

【讨论】:

  • 感谢 Yuri,我很感谢您抽出宝贵的时间。这是我的场景 - 基本上,我一个后端 API,我想为用户和整个租户存储信息。在我的某些应用程序中,我什至不需要授权,因为它只是该用户的个人信息。但是,我确实需要身份验证,以证明调用者是来自该特定租户的特定用户。显然,如果什么都没有(例如独立的 SPA),我会实现一个端到端的场景(例如使用 MSAL)。
  • (第 2 部分 - 空间不足)但是,Teams SSO 为用户提供了更加无缝的体验,并且它返回了一个基本的识别令牌,已经包含了我需要的一切(用户 ID 和租户 ID) ),但我的研究告诉我,我无法验证,因此也无法使用这个现有的令牌。从理论上讲,我真的不需要“OBO”,因为我不想在图中调用服务 - 我只想使用令牌 - 已经 - 包含的识别信息。
  • 嗨,希尔顿,感谢您帮助我更好地了解您的情况。您能否确认您正在使用microsoftTeams.authentication.getAuthToken API 获取访问令牌?如果是这样,您是否尝试过将该令牌放入 jwt.ms 并检查其内容?此令牌应将您的 Web API 的 resourceUri 作为受众,这意味着它适用于您的服务。您可以使用 Passport.js 之类的带有 passport-azure-ad 策略的东西来验证它。你可以在我的示例应用程序中看到我是如何做到这一点的:github.com/ydogandjiev/taskmeow/blob/master/server/…
  • 是的,我就是从那里得到它的,我已经用 jwt.io 检查了它。我想我已经意识到了我的问题——我一直在努力理解如何验证多租户令牌,因为我没有看到我期望看到的内容。据我所知 - 我可以验证 (A) Microsoft 签署了它(来自 "login.microsoftonline.com/organizations/v2.0/.well-known/…" 的 OIDC 签名密钥并且它 (B) 属于我的应用程序(使用观众),它我猜我需要的就是我。
  • 基于此,我可以相信声明,尤其是我需要的 oid 和 tid。
【解决方案2】:

要验证访问令牌,您需要验证签名、声明、颁发者、受众和签名令牌,这些都需要根据 OpenID 发现文档中的值进行验证。

参考 - https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-tokens

C# 示例 - How to validate Azure AD security token?

【讨论】:

  • 这种情况下的问题是它不仅仅是一个'Azure AD'令牌,它也是一个专门的Graph令牌,它似乎无法以普通方式通过验证 - 基本上是我要表达的观点。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2014-10-15
  • 1970-01-01
  • 2019-01-17
  • 2016-10-18
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多