Microsoft Graph认证:已登录用户追加额外声明实现咨询
.NET 6 Azure AD 增量授权实现方案
你需要的是Azure AD标准的增量同意能力,无需依赖未公开的接口,使用微软官方身份组件即可实现和Graph Explorer一致的交互效果,具体实现步骤如下:
前置依赖准备
首先确保项目安装了官方身份认证相关Nuget包:
Microsoft.Identity.WebMicrosoft.Identity.Web.UI
修正授权策略配置
你之前使用RequireClaim匹配权限的写法存在问题:Azure AD返回的委托权限是存储在scope声明下的空格分隔字符串,不会为每个权限单独生成一条声明,需要用官方提供的扩展方法做校验。修改Program.cs中的服务注册代码:
using Microsoft.Identity.Web; using Microsoft.AspNetCore.Authorization; // 服务注册部分 builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")); builder.Services.AddAuthorization(options => { // 修正策略校验逻辑,使用RequireScope匹配委托权限 options.AddPolicy("ClaimsTest", policy => policy.RequireScope("Contacts.Read")); options.AddPolicy("MustHaveOneDrive", policy => policy.RequireScope("Files.ReadWrite")); }); // 注册微软身份认证内置的UI页面,包含授权回调、同意相关逻辑 builder.Services.AddControllersWithViews() .AddMicrosoftIdentityUI();
实现权限不足时自动触发增量授权
在请求管道中添加逻辑,对已登录但权限不足的用户,自动发起带额外权限范围的授权挑战,引导用户完成补充同意:
// 中间件配置顺序注意:放在UseRouting之后、UseAuthorization之后、Map路由之前 app.UseAuthentication(); app.UseAuthorization(); app.Use(async (context, next) => { await next(); // 仅处理已登录但权限不足的请求 if (context.Response.StatusCode == 403 && context.User.Identity?.IsAuthenticated == true) { var endpoint = context.GetEndpoint(); var policyMetadata = endpoint?.Metadata.GetMetadata<IAuthorizeData>(); // 匹配当前访问需要的额外权限 var requiredScopes = policyMetadata?.Policy switch { "MustHaveOneDrive" => new List<string> { "Files.ReadWrite" }, "ClaimsTest" => new List<string> { "Contacts.Read" }, _ => new List<string>() }; if (requiredScopes.Any()) { // 发起OpenID Connect挑战,自动构造授权请求跳转到Azure AD同意页 var authProperties = new AuthenticationProperties { RedirectUri = context.Request.PathBase + context.Request.Path, Items = { // 传入需要追加申请的权限,基础的User.Read权限要保留 ["scope"] = $"User.Read {string.Join(" ", requiredScopes)}" } }; await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, authProperties); return; } } }); // 原有路由映射配置 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages();
效果验证
配置完成后,已通过基础认证的用户访问带有[Authorize(Policy="MustHaveOneDrive")]标记的页面/接口时,不会直接被拒绝访问,系统会自动跳转到Azure AD的权限同意页,仅展示当前需要追加申请的权限,用户完成同意后会自动跳回原访问页面,此时令牌中会携带对应权限声明,即可正常访问受保护资源。
注意:不要使用未公开的内部接口实现该能力,这类接口没有稳定性承诺,随时可能变更。增量同意是OAuth2.0标准协议支持的能力,官方组件已经做了完整封装,直接使用即可保证长期兼容。
内容的提问来源于stack exchange,提问作者Akaino
相关产品推荐
相关产品推荐

