在 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 似乎在创建“未知”用户?