ASP.NET Core 3.1部署IIS遇401.2未授权错误,求解决方案
解决ASP.NET Core 3.1 Azure AD认证部署IIS后401.2错误(禁用匿名认证)
原因分析
禁用匿名认证后,IIS默认会触发自身的认证逻辑,但你又不能启用Windows认证,这就导致请求还没到达ASP.NET Core的Azure AD认证中间件,就被IIS拦截返回401.2错误。核心解决思路是让IIS跳过自身认证,把请求完整传递给ASP.NET Core应用,由应用的Azure AD认证流程处理。
具体解决步骤
1. 修改web.config配置,让IIS pass-through请求
在应用的web.config中,调整<aspNetCore>和<security>节点,明确告诉IIS不处理认证:
<system.webServer> <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" forwardWindowsAuthToken="false" /> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="false" /> </authentication> </security> </system.webServer>
关键是forwardWindowsAuthToken="false",它会阻止IIS自行尝试认证,直接把请求交给ASP.NET Core管道。
2. 确认ASP.NET Core认证中间件顺序正确
在Startup.cs里,保证认证中间件在授权中间件之前加载,且全局授权策略要求用户认证:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseStaticFiles(); app.UseRouting(); // 先加载认证中间件,再加载授权 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
同时检查ConfigureServices里的Azure AD配置是否正确:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); }
3. 检查IIS应用程序池设置
- 应用程序池的
.NET CLR版本必须设为无托管代码,因为是.NET Core应用。 - 应用程序池身份建议用
ApplicationPoolIdentity,并确保该账户拥有应用目录的读写权限(尤其是日志目录)。
4. 验证IIS站点认证设置
在IIS管理器中找到你的站点,进入「认证」功能:
- 确认
匿名认证已禁用 - 确认
Windows认证已禁用 - 不需要启用其他IIS自带的认证方式
验证配置
完成上述操作后,重启IIS站点和应用程序池,访问应用时会自动跳转到Azure AD登录页面,登录成功后即可正常访问,不会再出现401.2错误。
内容的提问来源于stack exchange,提问作者Aashita
相关产品推荐
相关产品推荐

