【发布时间】: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是否存在并将其存储在会话存储中并删除cookie。同样在加载时,浏览器会检查用户是否登录,如果没有,它会删除会话存储的 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