如何将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
相关产品推荐
相关产品推荐

