从IIS到SQL Server的Kerberos Double Hop委托(使用django)

时间:2018-08-31 18:17:26

标签: sql-server django iis kerberos pyodbc

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

这是我到目前为止的设置

  1. sql_sever.domain.com上以服务帐户domain\svc_sqlserver运行SQL Server
  2. app_server.domain.com上使用IIS在服务帐户domain\svc_appserver上通过Windows身份验证和ASP.Net模拟(提供者设置为Negotiate:Kerberos -> Negotiate -> NTLM)在IIS上运行IIS网站
  3. 通过在连接中设置useAppPoolCredentials=True,使用Windows身份验证从Django连接到SQL Server
  4. Trusted_Connection=yesdomain\svc_sqlserver的Kerberos身份验证配置的SPN如下:

    domain\svc_appserver
  5. 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 svc_sqlserver都信任,以委托给svc_appserver服务,另外,对于MSSQLSvc,我也添加了domain\svc_appserver服务(来自上面的列表) )

结果

  1. Kerberos身份验证在SQL Server上有效。通过查看auth scheme of connected users
  2. 进行确认
  3. Kerberos身份验证可在Django网站上使用。通过检查HTTP响应标头和WWW-Authenticate请求标头(正确使用Authorization)进行确认
  4. Sql服务器应在Negotiate下运行,仅在domain\svc_appserver的上下文下运行

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

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

我正在使用

1 个答案:

答案 0 :(得分:3)

我不认为在FastCGI或Kestrel worker进程中运行的任何事物都可以实现模拟。参见例如ASP.NET核心:

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

如果使用HTTP Basic身份验证(要求用户输入密码),则可以使用Win32执行Logon并自己进行模拟。但是对于NTLM和Kerberos,没有简单的方法可以从python进程内部模拟调用用户。

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

我唯一想到的另一件事是通过实现模拟用户并管理python ASP.NET HttpHandlerprocesses running under the end user's identity来推出自己的Django托管。