请求Azure AD B2C令牌时出现作用域“scp”缺失

4

我正在尝试使用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门户:

  1. 我创建了一个新的Azure AD B2C租户。

  2. 我注册了一个应用程序。

applicationcreated

  1. API权限

在这里,我已经对它进行了很多探索,这些是我现在启用的权限:

https://i.ibb.co/DrV7fDv/permissions.png

  1. 创建用户流程

https://i.ibb.co/sPj2BSK/userFlow.png

然后当我运行用户流程时,这就是我得到的结果:

使用的链接:

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=login

token

我完全是新手,在研究了整个互联网之后,仍然无法弄清楚问题所在,以及为什么在从Azure门户提供的链接运行用户流程时,获得的令牌中没有scp。

如果您能帮忙找出我设置不正确或遗漏的部分,我将不胜感激。


你是在调用 Azure 受保护的 API 还是 MS Graph API? - Carl Zhao
2个回答

4
您所获得的是身份验证令牌。身份验证令牌中没有“scp”声明,它只包含已登录用户的信息。您执行的操作仅针对已登录用户。
如果您想获取“scp”声明,您应该请求访问令牌而不是身份验证令牌。请参考此处了解详细信息。

在获取令牌的POST操作中,我尝试使用Postman和curl执行它,但无论我尝试什么,都会出现“无法解析主机”的错误。对于开发人员获取令牌并测试API,推荐的场景是什么? - Roesmi
如果有人需要帮助的话,我成功地使用Postman获取了令牌,并在此帖子的帮助下完成了操作:https://dev59.com/TFYN5IYBdhLWcg3wi4ro 此外,我遗漏的是创建我的API范围并授予权限。非常感谢Carl,在这里和其他用户的帖子中提供的答案非常有帮助! - Roesmi

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将向我们展示您要查找的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接