如何在ASP.NET Core 7.0应用中实现Windows组身份验证?
解决ASP.NET Core 7.0本地非域环境下Windows组授权403问题
你在本地非域工作站创建ASP.NET Core 7 MVC应用,启用Windows身份验证后,给HomeController的Index方法添加[Authorize(Roles = @"LOCAL-WORKSTATION\AuthTestGroup")]特性出现403错误,可按以下步骤排查解决:
1. 确认机器名与组名的准确性
- 打开命令提示符,执行
echo %COMPUTERNAME%获取真实机器名,确保特性中填写的LOCAL-WORKSTATION与实际机器名完全一致 - 检查本地组
AuthTestGroup的拼写,Windows组名不区分大小写,但建议完全匹配避免潜在问题
2. 确保用户组权限已生效
- 本地用户添加到组后,必须注销当前Windows会话并重新登录,组权限才会被系统加载(Windows登录时会缓存组信息,不重启会话新添加的组不会生效)
- 登录后执行
whoami /groups命令,查看输出列表中是否包含AuthTestGroup,确认用户确实属于该组
3. 配置认证中间件加载Windows组角色声明
默认Negotiate认证可能不会自动将Windows组转换为Role类型的声明,需手动配置:
修改Program.cs中的认证服务配置:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(options => { options.Events = new NegotiateEvents { OnAuthenticated = context => { var windowsIdentity = context.Principal.Identity as WindowsIdentity; if (windowsIdentity != null) { // 将Windows组转换为Role类型的声明 var groupRoles = windowsIdentity.Groups .Select(group => group.Translate(typeof(NTAccount)).Value); foreach (var role in groupRoles) { context.Principal.AddIdentity( new ClaimsIdentity(new[] { new Claim(ClaimTypes.Role, role) }) ); } } return Task.CompletedTask; } }; });
4. 验证中间件顺序与服务器设置
- 确保Program.cs中中间件顺序正确,身份验证必须在授权之前执行:
app.UseRouting(); app.UseAuthentication(); // 先执行身份验证 app.UseAuthorization(); // 再执行授权 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); - 如果使用IIS Express运行:右键项目→属性→调试→Web服务器设置,确认Windows身份验证启用、匿名身份验证禁用
内容的提问来源于stack exchange,提问作者Sam Axe
相关产品推荐
相关产品推荐

