在IIS HTTP PlatformHandler前面使用Windows身份验证时,如何在Python中获取经过身份验证的用户名?

CJ Harmath

HttpPlatformHandler通过启用web.config中forwardWindowsAuthToken设置来支持转发身份验证令牌当需要使用Windows集成身份验证时,这听起来像是一项有用的功能。关于此文档非常含糊,因此不会解释如何使用此令牌来获取经过身份验证的用户名。

如果将此设置设置为true,则令牌将作为每个请求的标头“ X-IIS-WindowsAuthToken”转发到%HTTP_PLATFORM_PORT%侦听的子进程。该过程的责任是根据每个请求对此令牌调用CloseHandle。默认值为false。

在我的用例中,我需要将Windows集成身份验证与Python一起使用,因此也需要进行具有IIS前端设置并使用HTTP平台处理程序将请求转发到Python的设置。

问题是,如何从Python中提供的令牌中获取用户名?“ X-IIS-WindowsAuthToken”标头中的令牌看起来像是3个字符的十六进制字符,如22b。

CJ Harmath

好的,所以我对此进行了一些研究,最后回顾了Microsoft.AspNetCore.Server.IISIntegrateion.AuthenticationHandler如何做到的。

然后找出一种方法后,我想发布此答案,以便1)我可以稍后找到它,2)至少是这样,以防其他人想知道。

好的,所以十六进制值为句柄,并且可以使用句柄调用模拟用户,然后获取用户名,完成操作。

您需要的是pywin32软件包:

pip install pywin32

完整的Python示例:

import win32api
import win32security
if 'x-iis-windowsauthtoken' in request.headers.keys():
    handle_str = request.headers['x-iis-windowsauthtoken']
    handle = int(handle_str, 16) # need to convert from Hex / base 16
    win32security.ImpersonateLoggedOnUser(handle)
    user = win32api.GetUserName()
    win32security.RevertToSelf() # undo impersonation
    win32api.CloseHandle(handle) # don't leak resources, need to close the handle!
    print(f"user name: {user}")
    
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档