.NET5 ASP.NET Core WebApp在Kestrel上配置Windows认证不生效问题
现有配置核心问题
你的代码仅完成了认证服务和中间件的注册,未给访问资源添加授权校验规则。默认允许匿名访问的场景下,Kestrel不会主动触发Windows认证握手流程,因此无法加载用户身份信息,日志也会输出Negotiate was not authenticated的提示。
注意:本地IIS模式下运行正常是因为IIS层面直接禁用了匿名访问、开启了Windows认证,无需代码层面的授权规则就会强制触发认证;而Kestrel模式的认证触发完全由代码逻辑控制,二者行为存在差异。
修复步骤
优先添加授权规则,有两种实现方式:
- 给指定页面/全站点添加全局授权规则,修改
Startup.ConfigureServices中的Razor Pages配置:
services.AddRazorPages() .AddRazorPagesOptions(options => { // 仅给Index页添加认证要求 options.Conventions.AuthorizePage("/Index"); // 若需要全站强制认证,使用下面的配置 // options.Conventions.AuthorizeFolder("/"); });
- 给Index页的PageModel添加授权属性,修改
Index.cshtml.cs文件:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.RazorPages; [Authorize] public class IndexModel : PageModel { // 原有代码不变 }
其他需要排查的内容
- 服务运行账号权限:运行
WebApplication2.exe的账号必须为域账号,如果使用自定义域账号运行服务,需要为该账号注册对应站点的SPN(服务主体名称),执行命令:setspn -S HTTP/你的站点域名:端口 域\运行服务的账号名;如果使用本地系统/网络服务账号运行,SPN需要注册到服务器的计算机账号上。 - Kerberos访问规则:访问站点时优先使用域名而不是IP地址,Kerberos协议默认不支持IP形式的站点识别,IP访问会降级为NTLM认证,若服务器禁用了NTLM则会直接认证失败。
- 服务器安全策略:运行
secpol.msc打开本地安全策略,依次进入「本地策略→用户权限分配」,确认运行服务的账号和访问用户都在「允许通过网络访问此计算机」「在本地登录」的允许列表中,没有被加入拒绝列表。 - 浏览器配置:确认站点已经加入浏览器的本地Intranet站点列表,Firefox需要手动在
about:config中修改network.negotiate-auth.trusted-uris配置,添加你的站点地址才会自动发送Windows认证凭证。 - 系统补丁:确认Windows Server 2012已经安装了最新的安全更新,该版本存在多个已知的Kerberos认证相关BUG,未安装补丁会导致Negotiate认证失败。
内容的提问来源于stack exchange,提问作者A K
相关产品推荐
相关产品推荐

