基于Microsoft Identity平台,如何获取认证后访问令牌及相关作用域?
问题
在.NET 6的Program.cs中,我使用以下代码进行Azure AD认证:
string[] initialScopes = builder.Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' '); builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.GetSection("AzureAd").Bind(options); options.NonceCookie.SecurePolicy = CookieSecurePolicy.Always; options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always; });
我希望通过Microsoft Identity平台认证流程,在认证后获取访问令牌,用于后续请求访问受保护资源,无需每次使用JavaScript获取新令牌。我已拥有clientId、tenantId和clientSecret。
参考以下代码示例,请问如何获取代码中的scopeRequiredByApi和scopesToAccessDownstreamApi的内容?
[Authorize] public class MyApiController : Controller { /// <summary> /// The web API will accept only tokens 1) for users, 2) that have the `access_as_user` scope for /// this API. /// </summary> static readonly string[] scopeRequiredByApi = new string[] { "access_as_user" }; static readonly string[] scopesToAccessDownstreamApi = new string[] { "api://MyTodolistService/access_as_user" }; private readonly ITokenAcquisition _tokenAcquisition; public MyApiController(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async IActionResult Index() { HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi); string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(scopesToAccessDownstreamApi); return await callTodoListService(accessToken); } }
解答
一、scopeRequiredByApi的获取方式
scopeRequiredByApi是当前API自身定义的权限范围,用于限制只有拥有该权限的用户才能访问此API。获取步骤:
- 登录Azure门户,找到当前.NET 6项目对应的Azure AD应用注册。
- 左侧菜单选择「公开API」,点击「添加范围」。
- 按提示设置范围信息:
- 范围名称:可自定义(比如示例的
access_as_user,或read_data、write_data这类符合业务的名称)。 - 谁能同意:根据需求选择「管理员和用户」或仅「管理员」。
- 填写显示名称、描述等信息后完成创建。
- 范围名称:可自定义(比如示例的
- 创建完成后,这个范围的名称就是
scopeRequiredByApi要填入的值。
二、scopesToAccessDownstreamApi的获取方式
这个是你要访问的下游受保护API定义的权限范围,格式为api://<下游API的Client ID>/<权限范围名称>,获取步骤:
- 登录Azure门户,找到下游受保护API对应的Azure AD应用注册。
- 进入「公开API」页面,查看已创建的权限范围(未创建则按上述步骤新增)。
- 复制「应用程序ID URI」(通常是
api://<下游API的Client ID>或自定义域名)。 - 将应用程序ID URI与权限范围名称拼接,得到类似示例
api://MyTodolistService/access_as_user的字符串,填入scopesToAccessDownstreamApi即可。
额外注意事项
- 需确保当前.NET 6应用(客户端应用)已被授予访问下游API对应权限范围的权限:在Azure门户的客户端应用「API权限」中添加下游API的权限,并完成管理员同意。
- 示例代码中
GetAccessTokenForUserAsync是异步方法,必须添加await关键字,同时方法要标记为async,否则会编译报错。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

