在 Azure AD B2C 中请求令牌时缺少范围“scp”

Posted

技术标签:

【中文标题】在 Azure AD B2C 中请求令牌时缺少范围“scp”【英文标题】:Scope "scp" missing when Requesting a token in Azure AD B2C 【发布时间】:2021-04-18 14:21:20 【问题描述】:

所以我正在尝试使用 Azure AD B2C 保护 Web API,但是当我尝试使用使用“运行用户流”获得的令牌访问端点时,我收到以下异常:

System.UnauthorizedAccessException:IDW10201:既不是作用域也不是角色 在不记名令牌中找到声明。

我的代码:

我创建了一个新的 ASP.NET Core 应用程序并使用对话框自动添加身份验证。

代码中一些有趣的点:

我尝试将以下内容添加到 appsettings.json 文件中,但没有帮助:

"AllowWebApiToBeAuthorizedByACL": true

我尝试从控制器中删除它,但没有帮助:

// The Web API will only accept tokens 1) for users, and 2) having the "access_as_user" scope for this API
static readonly string[] scopeRequiredByApi = new string[]  "access_as_user" ;
HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);

在 ConfigureServices 我有以下代码:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));

Azure 门户:

    我为 Azure AD B2C 创建了一个新租户

    我注册了一个应用程序

    API 权限

这里我玩了很多,这些是我现在启用的权限:

    创建用户流

然后,当我运行用户流时,我得到了:

使用的链接:

https://xxxxxxxxxxx001.b2clogin.com/xxxxxxxxx001.onmicrosoft.com/oauth2/v2.0/authorize?

p=B2C_1_user_flow_test_signinsignup

&client_id=xxxxxxxxxxxx

&nonce=defaultNonce

&redirect_uri=https%3A%2F%2Fjwt.ms

&scope=openid

&response_type=id_token

&prompt=登录

我对 azure 完全陌生,在研究了整个互联网之后,我无法弄清楚这里的问题是什么,以及为什么 scp 不在我从 azure 门户中提供的链接运行用户流时获得的令牌中。

对于我缺少设置或设置错误的内容,我非常感谢。

【问题讨论】:

您调用的是受 Azure 保护的 api 还是 MS graph api? 我正在使用 Azure 门户中的“运行用户流”功能。基本上它只提供一个链接,如下所示:mytenant.b2clogin.com/mytenant.onmicrosoft.com/oauth2/v2.0/… 【参考方案1】:

添加到 Carl 的答案中,使用 B2C 链接您只会获得一个 ID 令牌,因为它将响应类型设置为 id_token,就像文章所述。为了获得访问令牌,您的 response_type 字段需要是“response_type=code”或“response_type=code+id_token”,即使这样 JWT.ms 也不会显示它。如果您捕获开发工具网络跟踪,您将在 authresp 框架 access_token 和 id_token 中看到两个参数。用 jwt.io 解码 access_token 会告诉我们你在找什么。

【讨论】:

【参考方案2】:

你得到的是 id 令牌。 id 令牌没有 scp 声明。它只包含登录用户的信息。您正在执行的只是登录用户的操作。

如果您想获得scp 声明,您应该request an access token 而不是id 令牌。

【讨论】:

在获取令牌的 POST 操作中,我尝试使用 Postman 和 curl 执行它,无论我尝试什么,我都会得到“无法解析主机”。开发者获取令牌并测试 API 的推荐场景是什么? 以防万一它对某人有所帮助,我在这篇文章的帮助下设法使用 Postman 获取了令牌:***.com/questions/47275079/… 另外,我缺少的是创建我的 API 范围并授予他们权限。非常感谢 Carl,您在此处和其他用户的其他帖子中的回答非常有帮助!

以上是关于在 Azure AD B2C 中请求令牌时缺少范围“scp”的主要内容,如果未能解决你的问题,请参考以下文章

在 Postman 中为受 Azure AD B2C 保护的 Azure Function App 请求访问令牌

刷新 id_token 时,Azure AD B2C 似乎在创建“未知”用户?

是否可以强制禁用 Azure AD B2c 中的访问令牌?

在 Azure B2C 中获取刷新令牌,Azure AD App 是第三方 IDP

Azure AD:访问令牌中缺少角色声明

Azure AD B2C OpenID Connect 刷新令牌