You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:25:17