【问题标题】:Allow passing id_token instead of Access Token to api允许将 id_token 而不是 Access Token 传递给 api
【发布时间】:2021-07-26 22:10:40
【问题描述】:

我有一个较旧的 web 应用程序,它具有我需要继续支持的隐含流程。我尝试使用 Microsoft.Identity.Web 1.9.0.0 但它不允许我使用 id_token 它只需要授权标头中的访问令牌我收到以下错误消息:

[10:09:31.861 -04:00] [ERR] [] [] 发生未处理的异常 在执行请求时。 System.UnauthorizedAccessException: IDW10201:在不记名令牌中找不到范围或角色声明。 在 Microsoft.Identity.Web.MicrosoftIdentityWebApiAuthenticationBuilderExtensions.c__DisplayClass3_1.d.MoveNext()

是否有允许它的设置?我在 JwtBearerOptions 或 MicrosoftIdentityOptions 中看不到一个。 当我使用 Microsoft.AspNetCore.Authentication 3.1.0.0 库时它确实有效,但我希望拥有最新的库。任何建议都会很棒。

编辑:更多细节

我们公司正在经历重大的技术转变。他在 .net 核心和 Web 组件(Polymer)中为前端构建了很多东西,但是.我们决定切换到 Azure AD B2C。我们将 .net 核心和现有的 Polyymer UI 切换到授权代码流没有问题。 我们在 .net 网络表单中有很多资产。这些 Web 表单是使用表单身份验证成员身份的大型项目。我们没有资源一次性将所有 UI 切换到 Web 组件和 .net 核心。该计划是将标识切换到 Azure AD B2C 并将其发布到生产环境。当有更改请求或新功能请求时,我们将仅在 HTML 和 Web 组件 (Polymer) 中构建新页面,并使用 .net 核心 api 来处理这些 api 请求。问题是 Web 组件无权访问访问令牌。

我找到的解决方案是,当 Web 表单从 B2C 获得响应时,我将 OpenIdConnectAuthenticationNotifications 连接到 SecurityTokenReceived,后者读取 IdToken,并将其放入 cookie 中(30 秒)到期并将其返回给浏览器。我有javascript代码读取cookie是否存在并将其存储在会话存储中并删除co​​okie。同样在加载时,浏览器会检查用户是否登录,如果没有,它会删除会话存储的 id_token。

这按预期工作,但问题是它使用 id_token 而不是使用授权代码流。因此,当访问任何其他 API 时,我无法从 B2C 请求其他 API 的令牌。此外,我无法获得刷新令牌(计划将其设置为 8 小时到期,这已经足够了)。我已经研究过是否可以使其与代码流一起使用。我已经研究过它在 MVC 中是如何工作的,但我还没有让它工作, 这是我之前转B2C的项目https://github.com/AzureADQuickStarts/B2C-WebApp-OpenIdConnect-DotNet

【问题讨论】:

  • 为什么要使用id_token? id token 和 access token 的声明类似。

标签: c# azure-ad-b2c


【解决方案1】:

错误消息需要不记名令牌中的范围或角色。请按照本文档了解隐式流程与授权代码流程的概念。

https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-implicit-grant-flow

【讨论】:

  • 谢谢。我确实了解隐式与授权代码流的概念。我为上下文添加了更多细节。如果这有助于指出更好的解决方案,我将不胜感激
【解决方案2】:

决定放弃之后。在另一个项目上工作,我不得不解决这个问题。决定再搜索一下,发现这个帖子 https://github.com/AzureAD/microsoft-identity-web/wiki/web-apis#to-support-acl-based-authorization

通过此堆栈溢出 Q/A IDW10201: Neither scope or roles claim was found in the bearer token 这是使用最新的 Microsoft.Identity.Web 包所需要的。总结一下,您需要设置 Azure 选项变量 AllowWebApiToBeAuthorizedByACL = true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多