首页 > 解决方案 > 从 IIS 到 SQL 服务器的 Kerberos 双跳委派(使用 django)

问题描述

我需要将凭据(集成 Windows 身份验证)从 IIS 上的 django 网站传递到后端 SQL 服务器,以便它在正确的用户上下文下运行。

这是我的设置到目前为止的样子

  1. sql_sever.domain.com在服务帐户下运行 SQL Serverdomain\svc_sqlserver
  2. 在具有 Windows 身份验证和 ASP.Net 模拟(提供程序设置为)app_server.domain.com的服务帐户下使用 IIS运行 Django 网站domain\svc_appserverNegotiate:Kerberos -> Negotiate -> NTLMuseAppPoolCredentials=True
  3. Trusted_Connection=yes通过在连接中设置使用 Windows 身份验证从 django 连接到 SQL 服务器
  4. 为 Kerberos 身份验证配置的 SPNdomain\svc_sqlserver如下domain\svc_appserver

    setspn -a HTTP/app_server                          domain\svc_appserver
    setspn -a HTTP/app_server.domain.com               domain\svc_appserver
    setspn -a MSSQLSvc/sql_server.domain.com:PORT      domain\svc_sqlserver
    setspn -a MSSQLSvc/sql_server.domain.com:INSTANCE  domain\svc_sqlserver
    setspn -a MSSQLSvc/sql_server.domain.com           domain\svc_sqlserver
    
  5. 既受信任,svc_sqlserver也受信任svc_appserver委托给MSSQLSvc服务,另外,domain\svc_appserverHTTP也添加了服务(来自上面的列表)

结果

  1. Kerberos 身份验证适用于 SQL Server。通过查看已连接用户的身份验证方案确认
  2. Kerberos 身份验证适用于 Django 网站。通过检查WWW-Authenticate响应标头和Authorization请求标头确认(Negotiate正在正确使用)
  3. Sql server 只在domain\svc_appserver它应该运行的上下文中运行domain\remote_user

我已经为此工作了一个多星期,但是对于我的一生,我无法弄清楚如何将经过身份验证的用户上下文从 IIS 传递到 SQL Server。我浏览了数百个在网上找到的链接,但我现在不知道该怎么做。

还有什么我想念的吗?在建立与数据库的连接之前,Django 中有什么方法可以设置用户的上下文吗?如果有人可以提供帮助,我将不胜感激。谢谢!

我正在使用

标签: sql-serverdjangoiiskerberospyodbc

解决方案


我不相信在 FastCGI 或 Kestrel 工作进程中运行的任何东西都实现了模拟。参见例如 ASP.NET 核心:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-2.1&tabs=aspnetcore2x#impersonation

如果您使用 HTTP Basic auth,它要求用户通过密码分叉,您可以使用 Win32 执行登录并自己进行模拟。但是对于 NTLM 和 Kerberos,没有简单的方法可以从您的 python 进程内部模拟调用用户。

或者,如果这是一个自定义应用程序,您可以使用SQL Impersonation,或将最终用户的身份传递给SESSION_CONTEXT,以便服务器端代码可以看到它。也有可能增强 django-pyodbc-azure 来做到这一点。

我能想到的唯一另一件事是通过实现模拟用户并管理在最终用户身份下运行的 python 进程的ASP.NET HttpHandler来滚动您自己的 Django 托管。


推荐阅读