允许将 id_token 而不是访问令牌传递给 api

时间:2021-05-04 14:34:28

标签: c# azure-ad-b2c

我有一个较旧的 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 core 和 web components (Polymer) 中为前端构建了很多东西,但是 .我们决定改用 Azure AD B2C。我们将 .net 核心和现有聚合物 UI 切换到授权代码流没有问题。 我们在 .net 网络表单中有很多资产。这些 Web 表单是使用表单身份验证成员身份的大型项目。我们没有资源一次性将所有 UI 切换到 Web 组件和 .net 核心。计划是将标识切换到 Azure AD B2C 并将其发布到生产环境中。当有变更请求或新功能请求时,我们只会在 HTML 和 Web 组件(聚合物)中构建新页面,并有一个 .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

2 个答案:

答案 0 :(得分:0)

谢谢@greektreat 和错误消息期望不记名令牌中的范围或角色,请按照此文档了解隐式流与授权代码流概念。

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

如果您需要更多信息,请告诉我们。

答案 1 :(得分:0)

决定放弃之后。在一个不同的项目上工作,我不得不交叉这个问题。决定再次搜索并找到这篇文章 https://github.com/AzureAD/microsoft-identity-web/wiki/web-apis#to-support-acl-based-authorization

通过这个Stack Overflow Q/A IDW10201: Neither scope or roles claim was found in the bearer token 这是使用最新的 Microsoft.Identity.Web 包所需要的。总而言之,您需要设置 Azure 选项变量 AllowWebApiToBeAuthorizedByACL = true

相关问题