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

Blazor Server应用向.NET Core Data Api传递Windows凭据访问SQL Server可行吗?

问题分析与解决方案

你的需求是可行的,但核心障碍是Windows身份验证的双跳问题:Blazor应用将用户身份传递到API是第一跳,API再用该身份连接SQL Server是第二跳,默认情况下Windows身份验证不允许跨服务的身份传递,因此会 fallback 到IIS应用池账户。以下是具体解决步骤:

1. 基础身份验证配置

Blazor Server端配置(假设使用Server模式,WebAssembly无法直接获取Windows身份)

在Program.cs中启用Windows身份验证:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();
builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

同时在IIS站点配置(或开发环境的launchSettings.json)中启用Windows身份验证,禁用匿名访问。

.NET Core Data API配置

API端同样需要启用Windows身份验证,确保能正确接收Blazor传递的用户身份,配置逻辑与Blazor端一致。

2. 配置Kerberos约束委派(关键)

要实现身份从Blazor → API → SQL Server的跨服务传递,必须配置Kerberos约束委派:

  • 为SQL Server注册服务主体名称(SPN):如果SQL Server使用域账户运行,执行命令:
    setspn -S MSSQLSvc/<sql-server-fqdn>:<端口> <域\sql服务账户>
    
    若使用本地系统账户,SPN会自动注册,但建议改用域账户以确保委派稳定性。
  • 为API应用池账户配置委派权限:在Active Directory用户和计算机中,找到API应用池对应的域账户(建议不要用内置账户如ApplicationPoolIdentity),打开属性→委派→选择「信任此用户作为委派到指定服务」,添加SQL Server的SPN。

3. 代码中正确实现身份模拟

你之前使用WindowsIdentity.RunImpersonatedAsync的问题在于,IIS环境下user.Identity是模拟令牌而非可传递的主令牌。正确的模拟方式如下:

// 在API的数据库访问方法中
var windowsIdentity = (WindowsIdentity)User.Identity;
using var impersonationContext = windowsIdentity.Impersonate();
try
{
    // 此时Trusted_Connection会使用当前模拟的用户身份连接SQL Server
    using var connection = new SqlConnection("Server=<sql-server地址>;Database=<数据库名>;Trusted_Connection=True;");
    await connection.OpenAsync();
    // 执行数据库操作
}
finally
{
    impersonationContext.Undo();
}

无需手动处理AccessToken,直接利用当前请求的User.Identity进行模拟即可。

4. 额外注意事项

  • 确保客户端机器、API服务器、SQL Server处于同一Active Directory域中。
  • 开发环境使用IIS Express时,需在applicationhost.config中启用Windows身份验证;若SQL Server在本地,NTLM可临时替代Kerberos,但跨机器场景必须用Kerberos。
  • 全程禁用匿名身份验证,强制所有请求携带Windows用户身份。

内容的提问来源于stack exchange,提问作者Sandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:03