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

如何将ASP.NET凭据传递至IIS及SQL Server?

实现用户级别SQL Server访问的配置方案

我之前多次配置过这类场景,核心是让前端用户的Windows身份通过IIS委派到SQL Server,完全绕开DefaultAppPool的身份,实现基于用户的权限管控。下面是详细的分步配置:

1. 前提准备

  • 确保IIS服务器、SQL Server服务器和用户登录的客户端都加入同一个Active Directory域(如果是工作组环境,只能用NTLM且无法跨机器委派,权限管控会受限,优先推荐域环境)
  • 给每个需要访问SQL的域用户在SQL Server中创建对应的登录名,并分配合适的数据库权限(比如只读、读写等)

2. IIS服务器配置

2.1 启用Windows身份验证

  • 打开IIS管理器,找到你的Razor Pages站点,在功能视图中双击“身份验证”
  • 禁用匿名身份验证,启用Windows身份验证
  • 右键点击Windows身份验证,选择“提供程序”,确保**Negotiate(Kerberos)**排在NTLM前面(优先用Kerberos实现委派)

2.2 配置应用池的服务账户(关键)

  • 不要用默认的DefaultAppPool账户,创建一个域服务账户(比如DOMAIN\IISAppPoolAcct)
  • 在IIS管理器中,找到应用池,右键选择“高级设置”,将“标识”改为这个域服务账户
  • 给这个域服务账户在IIS服务器上分配必要的权限:比如加入IIS_IUSRS组,以及站点文件夹的读写权限

2.3 配置Kerberos约束委派(核心步骤)

  • 在域控制器的Active Directory用户和计算机中,找到刚才创建的域服务账户(DOMAIN\IISAppPoolAcct)
  • 右键属性,切换到“委派”选项卡,选择信任此用户用于委派到指定服务,然后点击“添加”
  • 在弹出的窗口中点击“用户或计算机”,找到SQL Server服务器的计算机账户,然后选择SQL Server的服务(默认是MSSQLSvc,如果是命名实例的话是MSSQLSvc\SQLSERVERNAME:PORT)
  • 确认保存,这样IIS的应用池账户就被允许将用户身份委派到SQL Server服务

3. SQL Server配置

  • 打开SQL Server Management Studio(SSMS),连接到SQL Server Express
  • 确保SQL Server的身份验证模式设置为Windows身份验证模式(混合模式也可以,但我们只用到Windows身份)
  • 为每个需要访问的域用户创建SQL登录名:
    CREATE LOGIN [DOMAIN\UserName] FROM WINDOWS;
    
  • 然后给这个登录名分配数据库角色或权限,比如:
    USE YourDatabase;
    CREATE USER [DOMAIN\UserName] FOR LOGIN [DOMAIN\UserName];
    ALTER ROLE db_datareader ADD MEMBER [DOMAIN\UserName]; -- 只读权限
    

4. ASP.NET Razor Pages应用配置

  • 在appsettings.json中,将数据库连接字符串改为集成安全性模式,不要写用户名和密码:
    "ConnectionStrings": {
      "DefaultConnection": "Server=SQLSERVERNAME;Database=YourDatabase;Integrated Security=True;"
    }
    
  • 在Program.cs中,确保数据库上下文使用这个连接字符串,并且不要硬编码任何凭据:
    builder.Services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
    
  • 确保应用启用了Windows身份验证:
    builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);
    builder.Services.AddAuthorization();
    
  • 在需要访问数据库的页面或服务中,直接使用当前用户身份即可,比如在PageModel中:
    public async Task<IActionResult> OnGet()
    {
        var currentUser = User.Identity.Name; // 会拿到当前登录的域用户名
        var data = await _context.YourTable.ToListAsync();
        return Page();
    }
    

5. 测试与排查

  • 用域用户登录客户端机器,访问Razor Pages站点,执行一个需要访问SQL的操作
  • 在SQL Server的SQL Server日志中查看登录记录,应该能看到是DOMAIN\UserName而不是应用池账户登录的
  • 如果遇到权限问题,先检查:
    • 域服务账户的委派配置是否正确
    • SQL Server中用户的权限是否分配到位
    • IIS的Windows身份验证是否启用且Negotiate优先
    • 连接字符串的Integrated Security=True是否正确设置

注意:如果是工作组环境(没有域),这种跨机器的身份委派无法实现Kerberos,只能用NTLM,但NTLM无法传递身份到另一台机器,这时候只能考虑让用户在Web应用中手动输入凭据,然后用这些凭据连接SQL Server,但这种方式安全性较低,不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:49:42