启用匿名认证时,如何让IIS传递Windows身份至ASP.NET Core应用?
解决同时启用匿名与Windows认证时身份传递问题
1. 调整ASP.NET Core认证服务配置
在Program.cs中,除了注册Windows认证方案,还需启用Negotiate认证(Windows认证的核心实现),并配置授权策略以兼顾匿名访问与身份验证需求:
using Microsoft.AspNetCore.Server.IISIntegration; var builder = WebApplication.CreateBuilder(args); // 添加Windows认证及Negotiate协议支持 builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme) .AddNegotiate(); // 配置授权策略:默认要求用户认证,可通过[AllowAnonymous]标记开放匿名访问的页面/接口 builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); }); // 注册Razor Pages/MVC服务(根据项目类型调整) builder.Services.AddRazorPages(); var app = builder.Build(); // 中间件顺序必须遵循:认证在前,授权在后 app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
2. 更新IIS站点认证设置
- 打开IIS管理器,定位目标站点,进入身份验证功能面板
- 确保匿名认证和Windows认证均处于启用状态
- 双击Windows认证进入高级设置,勾选启用内核模式认证(InProcess托管模式下必须开启,否则身份令牌无法正常传递)
3. 完善web.config配置
在aspNetCore节点中添加authenticationSchemes属性,明确指定Windows认证支持的协议:
<aspNetCore processPath="dotnet" arguments=".\ContractShortening.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" hostingModel="inprocess" authenticationSchemes="Negotiate,NTLM" />
4. 在页面中处理身份获取逻辑
由于同时启用匿名认证,系统不会自动触发Windows认证,需在需要获取身份的页面(如_Layout.cshtml)中添加逻辑,主动发起认证挑战:
@inject IHttpContextAccessor HttpContextAccessor @{ var user = HttpContextAccessor.HttpContext.User; if (!user.Identity.IsAuthenticated) { // 发起Windows认证挑战,认证完成后跳转回当前页面 var authProps = new Microsoft.AspNetCore.Authentication.AuthenticationProperties { RedirectUri = HttpContext.Request.Path }; await HttpContext.ChallengeAsync(IISDefaults.AuthenticationScheme, authProps); } } <!-- 认证完成后即可正常获取身份信息 --> <p>当前用户:@Context.User.Identity.Name</p>
5. 验证应用池配置
确保IIS应用池的身份设置为具备域访问权限的账户(如LocalSystem或域账户),避免因权限不足无法读取AD用户信息。
内容的提问来源于stack exchange,提问作者Michael1834
相关产品推荐
相关产品推荐

