.NET Core 6 Web应用IIS部署下Windows身份认证凭据传递异常排查
.NET Core 6 + IIS 10:Windows身份认证无法传递当前用户凭据到SQL Server
我开发了一个.NET Core 6 Web应用,通过IIS 10托管,后端使用SQL Server数据库,期望通过Windows身份认证管理数据库读写权限。但目前遇到的问题是:应用传递给SQL Server的是托管服务器的机器凭据(例如domain\servername$),而非当前访问应用的用户凭据(例如domain\kirstie.ballance)。
以下是针对性的排查与修复步骤:
1. 核对IIS身份认证核心配置
- 确保站点已启用Windows身份认证,同时禁用匿名认证(IIS站点→身份认证面板)
- 检查应用程序池设置:
- 若要传递用户凭据,应用程序池不能使用
ApplicationPoolIdentity这类内置账户,需配置为域内有委派权限的账户;或开启应用程序池的模拟功能 - 确认Windows身份认证的内核模式验证处于启用状态(默认开启,域环境下必须保持开启以支持Kerberos)
- 若要传递用户凭据,应用程序池不能使用
2. 验证.NET Core应用的身份认证配置
在Program.cs(.NET 6默认项目结构)中确保正确注入并启用Windows身份认证:
var builder = WebApplication.CreateBuilder(args); // 添加Windows身份认证服务 builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); builder.Services.AddAuthorization(); // 其他服务配置... var app = builder.Build(); // 启用认证、授权中间件(顺序不能错) app.UseAuthentication(); app.UseAuthorization(); // 其他中间件配置...
若使用兼容模式的Startup.cs,需在对应方法中配置:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(IISDefaults.AuthenticationScheme); services.AddAuthorization(); // ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件... app.UseAuthentication(); app.UseAuthorization(); // ... }
3. 配置数据库连接与Kerberos委派
- 连接字符串必须使用
Integrated Security=True,不能硬编码用户名密码:// appsettings.json "ConnectionStrings": { "DefaultConnection": "Server=你的SQL服务器地址;Database=目标数据库名;Integrated Security=True;" } - 跨机器部署时(应用与SQL Server不在同一服务器),必须在域控制器中配置Kerberos约束委派:给托管应用的服务器账户添加权限,允许其向SQL Server服务委派用户凭据(否则会回退到NTLM,无法传递用户身份)
- 确认SQL Server中已创建当前用户(如
domain\kirstie.ballance)的登录名,并分配了对应数据库的读写权限
4. 检查web.config配置
确保web.config中正确开启身份认证,按需配置模拟:
<system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> <aspNetCore processPath="dotnet" arguments=".\你的应用程序.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> </environmentVariables> </aspNetCore> </system.webServer> <!-- 如需启用模拟,添加以下配置 --> <system.web> <identity impersonate="true" /> </system.web>
注意:InProcess托管模式下,模拟功能需要额外权限;若使用OutOfProcess模式,需确保应用程序池账户具备足够权限。
5. 验证当前用户身份是否正确传递
在应用中添加测试接口,确认当前登录用户是否符合预期:
[Authorize] public IActionResult CheckCurrentUser() { var currentUser = User.Identity.Name; return Ok($"当前登录用户:{currentUser}"); }
- 若返回服务器机器账户:说明IIS身份认证未正确传递用户,需回到步骤1重新核对配置
- 若返回预期用户但数据库仍用机器账户:问题出在Kerberos委派或SQL Server权限配置
内容的提问来源于stack exchange,提问作者KirstieBallance
相关产品推荐
相关产品推荐

