【问题标题】:Microsoft as OAuth2 provider for personal accounts does not issue JWT access tokensMicrosoft 作为个人帐户的 OAuth2 提供者不颁发 JWT 访问令牌
【发布时间】:2021-10-23 01:15:04
【问题描述】:

微软好像不会为个人账户发放JWT访问令牌。

在 Azure AD 中,我创建了一个“仅限个人 Microsoft 帐户”类型的应用注册。
我的 SPA 使用该应用注册,我可以针对它进行身份验证。
验证我的 SPA 后,会收到一个 id 令牌和一个访问令牌。
但访问令牌看起来不像 JsonWebToken。

AFAIK 访问令牌始终以字符“eyJ”开头,但从 Azure AD 发出的令牌以“EwC”开头,当我在 jwt.ms 上调试访问令牌时,控制台告诉我“指定的令牌无效:意外令牌” .

但只有当我选择帐户类型“仅限 Microsoft 个人帐户”时才会出现这种情况。
如果我使用“仅此组织目录中的帐户”类型,它就可以工作。

当我将无效令牌发送到我的 REST Api 时,我会收到带有标题 WWW-Authenticate: Bearer error="invalid_token" 的 401 响应。
该 api 配置为接受 JWT Bearer 令牌并使用相同的 Azure AD 应用注册。

使用颁发的令牌调用 OAuth userinfo enpoint 工作正常。

值得一提的是,我通过个人 Microsoft 帐户使用 Azure。

有没有办法通过个人 Microsoft 帐户获取 JWT 访问令牌?

【问题讨论】:

    标签: oauth-2.0 azure-active-directory jwt access-token


    【解决方案1】:

    请检查以下是否适合您的解决方法

    1) JSON Web Tokens 由三部分组成,由点 (.) 分隔,分别是: Header.Payload.signature 。

    (图片from

    this 等场景之一中,令牌具有格式

    access_token=EwC...  &authentication_token=eyJ… 
    

    即;访问令牌以 EwC 开头,而身份验证以 eyJ 开头

    所以在你的情况下(SPA),它看起来使用“id_token”代替“access_token”

    id_token 是 JSON Web Token,用于识别经过身份验证的用户,例如对于 SSO。 access_token 必须用于证明对受保护资源的访问权限,例如用于 OpenId Connect 中的 userinfo 端点。
    所以尝试使用可能充当访问令牌的 id_token 进行调试。

    ID tokens | Microsoft Docs

    有时令牌过期可能是导致令牌身份验证无效的原因,因为令牌过期后可能无效。

    所以,检查令牌生命周期并创建一个新的身份验证请求。

    scenarios-spa

    另见scenario-spa-app-registration 上面写着

    如果您的应用程序登录用户,请选择 ID 令牌。

    如果您的应用程序还需要调用受保护的 Web API,请选择 访问令牌。有关这些令牌类型的更多信息, 见ID tokensAccess tokens

    2)

    一旦应用被注册,应用就会与 Microsoft 身份平台通过向端点发送请求:

    https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize

    https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

    {tenant} 可以采用不同的值之一:

    common 允许同时拥有个人 Microsoft 帐户和 Azure AD 中的工作/学校帐户以登录应用程序。

    消费者只允许拥有个人 Microsoft 帐户 (MSA) 的用户登录应用程序。

    即;在启动类中或在 SPA 中说 authconfig 文件

    代码示例:/quickstart-v2-javascript-auth-code

               Authority:”https://login.microsoftonline.com/consumers/......”, 
    

    参考资料:

    1. active-directory-v2-protocols#endpoints
    2. how-to-authenticate-in-microsoft-graph-with-microsoft-personal-accounts-only
    3. c-sharp-asp-net-core-bearer-error-invalid-token

    【讨论】:

    • @kavyasaraboju-MT 感谢您的回答。我尝试了您的所有建议,但没有任何效果。
    • 感谢您的更新。请检查代码中的范围、受众配置或删除 validateAuthority 属性(如果存在)并在此处详细检查类似问题>thread1thread2。如果问题仍然存在,请尽可能提供完整或相关的代码示例,并提供详细的错误创建其他有助于详细调查的问题。
    • 感谢您的支持。我会在周末尝试并报告。
    • 我只创建了一个应用注册,但就我而言,我必须创建两个,一个用于我的 SPA,一个用于 REST Api。然后 SPA 需要访问 REST Api 的权限。 docs.microsoft.com/en-us/azure/active-directory/develop/…
    【解决方案2】:

    阅读友好手册 (RTFM) 回答了我的问题。
    我必须在 azure 门户中创建两个应用注册。
    一个用于我的 SPA,一个用于我的 REST API,然后授予我的 SPA 访问 REST API 的权限。

    这里有很好的描述:
    https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis

    发送初始身份验证请求时,范围必须包含授予我的 REST API 的权限。
    响应将包含为 REST API 颁发的 JWT 访问令牌。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2014-10-15
      • 2021-08-15
      • 2021-05-28
      • 2015-04-16
      • 2021-11-27
      • 2016-04-26
      • 2020-01-13
      • 2017-09-05
      相关资源
      最近更新 更多