sql-server - 从 IIS 到 SQL 服务器的 Kerberos 双跳委派(使用 django)
问题描述
我需要将凭据(集成 Windows 身份验证)从 IIS 上的 django 网站传递到后端 SQL 服务器,以便它在正确的用户上下文下运行。
这是我的设置到目前为止的样子:
sql_sever.domain.com
在服务帐户下运行 SQL Serverdomain\svc_sqlserver
- 在具有 Windows 身份验证和 ASP.Net 模拟(提供程序设置为)
app_server.domain.com
的服务帐户下使用 IIS运行 Django 网站domain\svc_appserver
Negotiate:Kerberos -> Negotiate -> NTLM
useAppPoolCredentials=True
Trusted_Connection=yes
通过在连接中设置使用 Windows 身份验证从 django 连接到 SQL 服务器为 Kerberos 身份验证配置的 SPN
domain\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
既受信任,
svc_sqlserver
也受信任svc_appserver
委托给MSSQLSvc
服务,另外,domain\svc_appserver
我HTTP
也添加了服务(来自上面的列表)
结果:
- Kerberos 身份验证适用于 SQL Server。通过查看已连接用户的身份验证方案确认
- Kerberos 身份验证适用于 Django 网站。通过检查
WWW-Authenticate
响应标头和Authorization
请求标头确认(Negotiate
正在正确使用) - Sql server 只在
domain\svc_appserver
它应该运行的上下文中运行domain\remote_user
我已经为此工作了一个多星期,但是对于我的一生,我无法弄清楚如何将经过身份验证的用户上下文从 IIS 传递到 SQL Server。我浏览了数百个在网上找到的链接,但我现在不知道该怎么做。
还有什么我想念的吗?在建立与数据库的连接之前,Django 中有什么方法可以设置用户的上下文吗?如果有人可以提供帮助,我将不胜感激。谢谢!
我正在使用:
- django 2.0.7
- django-pyodbc-azure
- Python 3.6.5
- IIS 10、SQL Server 2014
解决方案
我不相信在 FastCGI 或 Kestrel 工作进程中运行的任何东西都实现了模拟。参见例如 ASP.NET 核心:
如果您使用 HTTP Basic auth,它要求用户通过密码分叉,您可以使用 Win32 执行登录并自己进行模拟。但是对于 NTLM 和 Kerberos,没有简单的方法可以从您的 python 进程内部模拟调用用户。
或者,如果这是一个自定义应用程序,您可以使用SQL Impersonation,或将最终用户的身份传递给SESSION_CONTEXT,以便服务器端代码可以看到它。也有可能增强 django-pyodbc-azure 来做到这一点。
我能想到的唯一另一件事是通过实现模拟用户并管理在最终用户身份下运行的 python 进程的ASP.NET HttpHandler来滚动您自己的 Django 托管。
推荐阅读
- java - cannot determine the cause of these test errors, debugger isnt functioning here, nor can i figure out how to resolve this
- scala - Scala group on named Tuple to get min value
- python - How do I store multiple values generated in a for loop to pass to a funtion within a tkinter button loop?
- java - How to define parameter list dynamically based on request type for request model in spring boot for swagger
- python - 在 keras 中多次拟合模型
- pine-script - 使用 Pinescript 声明基于时间延迟(或文字时钟时间)的变量
- java - 烂橘子 LeetCode
- c# - 无法从字符串转换为类
- python - 如何在 Python 列表中粘贴多个链接/URL
- python - 使用命令重命名频道并将其移动到不同的类别