You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Graph认证:已登录用户追加额外声明实现咨询

.NET 6 Azure AD 增量授权实现方案

你需要的是Azure AD标准的增量同意能力,无需依赖未公开的接口,使用微软官方身份组件即可实现和Graph Explorer一致的交互效果,具体实现步骤如下:

前置依赖准备

首先确保项目安装了官方身份认证相关Nuget包:

  • Microsoft.Identity.Web
  • Microsoft.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:31:10