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

如何将Razor Page限制给指定AD组用户?配置遇异常求助

解决方案

1. 修复认证配置错误

你遇到的InvalidOperationException是因为指定了默认认证方案为"Test",但没有为该方案提供对应的认证实现,同时Windows身份认证需要显式配置。修改Program.cs中的认证服务注册:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    // Add services to the container.
    builder.Services.AddRazorPages();
    // 启用Windows身份认证,并设置为默认方案
    builder.Services.AddAuthentication(Microsoft.AspNetCore.Authentication.Negotiate.NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    builder.Services.AddAuthorization(options =>
    {
        options.AddPolicy("Test", policy =>
            policy.Requirements.Add(new InCorrectGroupRequirement()));
    });
    // 注册授权处理器到依赖注入容器
    builder.Services.AddScoped<IAuthorizationHandler, InCorrectGroupAuthorizationHandler>();

    var app = builder.Build();

    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.MapRazorPages();

    app.Run();
}

2. 修正授权处理器逻辑

你的授权处理器存在两个问题:一是IHttpClientFactory未被使用可移除;二是获取用户身份的方式不够严谨,同时测试逻辑可调整得更可靠:

public class InCorrectGroupAuthorizationHandler : AuthorizationHandler<InCorrectGroupRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, InCorrectGroupRequirement requirement)
    {
        // 确保用户已通过Windows认证
        if (context.User.Identity?.IsAuthenticated == true)
        {
            // 测试用:验证用户名是否为"pass"
            if (context.User.Identity.Name.Equals("pass", StringComparison.OrdinalIgnoreCase))
            {
                context.Succeed(requirement);
            }
            // 后续替换为AD组验证:检查用户是否属于指定AD组
            // else if (context.User.IsInRole("你的AD组名称"))
            // {
            //     context.Succeed(requirement);
            // }
        }
        return Task.CompletedTask;
    }
}

public class InCorrectGroupRequirement : IAuthorizationRequirement
{
}

3. 关键配置说明

  • Windows身份认证启用:使用AddNegotiate()启用Windows身份认证(ASP.NET Core处理Windows/AD认证的标准方式),并将其设为默认认证方案,解决DefaultChallengeScheme缺失的问题。
  • 授权处理器注册:必须将自定义授权处理器注册到DI容器,否则框架无法发现并调用它处理InCorrectGroupRequirement需求。
  • AD组验证:测试通过后,只需将用户名判断替换为context.User.IsInRole("你的AD组名称"),Windows认证会自动将用户的AD组作为角色注入到ClaimsPrincipal中。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:01:10