我需要将IIS上django网站上的凭据(集成Windows身份验证)传递到后端SQL服务器上,以便它可以在适当的用户上下文中运行。
这是我到目前为止的设置:
sql_sever.domain.com
上以服务帐户domain\svc_sqlserver
运行SQL Server app_server.domain.com
上使用IIS在服务帐户domain\svc_appserver
上通过Windows身份验证和ASP.Net模拟(提供者设置为Negotiate:Kerberos -> Negotiate -> NTLM
)在IIS上运行IIS网站{1}} useAppPoolCredentials=True
,使用Windows身份验证从Django连接到SQL Server 为Trusted_Connection=yes
和domain\svc_sqlserver
的Kerberos身份验证配置的SPN如下:
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
和svc_sqlserver
都信任,以委托给svc_appserver
服务,另外,对于MSSQLSvc
,我也添加了domain\svc_appserver
服务(来自上面的列表) )
结果:
HTTP
响应标头和WWW-Authenticate
请求标头(正确使用Authorization
)进行确认Negotiate
下运行,仅在domain\svc_appserver
的上下文下运行我已经为此工作了一个多星期,但是对于我一生来说,我一直不知道如何将经过身份验证的用户上下文从IIS传递到SQL Server。我浏览了数百个在线找到的链接,但现在不确定该怎么做。
还有其他我想念的东西吗?在建立与数据库的连接之前,Django中有什么方法可以设置用户的上下文?如果有人可以提供帮助,我将不胜感激。谢谢!
我正在使用:
答案 0 :(得分:3)
我不认为在FastCGI或Kestrel worker进程中运行的任何事物都可以实现模拟。参见例如ASP.NET核心:
如果使用HTTP Basic身份验证(要求用户输入密码),则可以使用Win32执行Logon并自己进行模拟。但是对于NTLM和Kerberos,没有简单的方法可以从python进程内部模拟调用用户。
或者,如果这是一个自定义应用程序,则可以使用SQL Impersonation,或将最终用户的身份传递给SESSION_CONTEXT,在服务器端代码中可以看到它。也可以增强django-pyodbc-azure来做到这一点。
我唯一想到的另一件事是通过实现模拟用户并管理python ASP.NET HttpHandler的processes running under the end user's identity来推出自己的Django托管。