Sql server 从IIS到SQL server的Kerberos双跳委派(使用django)

Sql server 从IIS到SQL server的Kerberos双跳委派(使用django),sql-server,django,iis,kerberos,pyodbc,Sql Server,Django,Iis,Kerberos,Pyodbc,我需要将凭据(集成Windows身份验证)从IIS上的django网站传递到后端SQL server,以便它在正确的用户上下文下运行 到目前为止,我的设置就是这样的: 在服务帐户下的SQL\u Server.domain.com上运行SQL Serverdomain\svc\u sqlserver 在app\u server.domain.com上运行Django网站,在带有Windows身份验证和ASP.Net模拟的服务帐户domain\svc\u appserver下使用IIS(提供程序设置

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

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

  • 在服务帐户下的
    SQL\u Server.domain.com
    上运行SQL Server
    domain\svc\u sqlserver
  • app\u server.domain.com
    上运行Django网站,在带有Windows身份验证和ASP.Net模拟的服务帐户
    domain\svc\u appserver
    下使用IIS(提供程序设置为
    协商:Kerberos->协商->NTLM
  • 通过在连接中设置
    Trusted\u Connection=yes
    ,使用Windows身份验证从django连接到SQL server
  • domain\svc\u sqlserver
    domain\svc\u appserver
    配置了Kerberos身份验证的SPN,如下所示:

    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\u-sqlserver
    svc\u-appserver
    以授权给
    MSSQLSvc
    服务,此外,还信任
    domain\svc\u-appserver
    我也添加了
    HTTP
    服务(从上面的列表)

  • 结果

  • Kerberos身份验证在SQL Server上工作。通过查看确认
  • Kerberos身份验证在Django网站上工作。通过检查
    WWW-Authenticate
    响应头和
    authentication
    请求头确认(
    协商
    正在正确使用)
  • Sql server仅在
    domain\svc\u appserver
    上下文下运行,而它应该在
    domain\remote\u user
  • 我已经为此工作了一个多星期了,但就我的一生而言,我不知道如何将经过身份验证的用户上下文从IIS传递到SQL Server。我浏览了网上找到的数百个链接,现在我不知道该怎么办

    我还缺什么吗?在Django中,在建立到数据库的连接之前,有没有办法设置用户的上下文?如果有人能帮忙,我将不胜感激。谢谢

    我正在使用

    • django 2.0.7
    • Python 3.6.5
    • IIS 10,SQL Server 2014

    我不相信在FastCGI或Kestrel worker进程中运行的任何东西都实现了模拟。有关ASP.NET核心,请参见eg:

    如果使用HTTP Basic auth(要求用户提供密码),则可以使用Win32执行模拟,然后自己进行模拟。但是对于NTLM和Kerberos,没有简单的方法从python进程内部模拟调用用户

    或者,如果这是一个自定义应用程序,您可以使用或将最终用户的身份传递到服务器端代码可以看到的位置。也可以通过增强django pyodbc azure来实现这一点


    我唯一能想到的另一件事是通过实现一个模拟用户并管理python的应用程序来运行自己的Django主机。

    我想我可以使用SQL模拟。我还没有足够的因果报应去投票,但我接受了你的答案。谢谢