Как получить аутентифицированное имя пользователя в Python при обращении к нему с помощью IIS HTTP PlatformHandler и с использованием Windows auth? - PullRequest
1 голос
/ 09 июля 2020

HttpPlatformHandler поддерживает пересылку токена аутентификации путем включения параметра forwardWindowsAuthToken в файле web.config. Звучит как полезная функция при необходимости использования Windows встроенной аутентификации. документ по этому поводу очень расплывчатый и не go объясняет, как можно использовать этот токен для получения аутентифицированного имени пользователя.

Если для этого параметра установлено значение true, токен будет перенаправлен дочернему процессу, прослушивающему% HTTP_PLATFORM_PORT%, в качестве заголовка X-IIS-WindowsAuthToken для каждого запроса. Этот процесс несет ответственность за вызов CloseHandle для этого токена для каждого запроса. Значение по умолчанию - false.

В моем случае мне нужно было использовать Windows Integrated Authentication с Python, так же как и при настройке с помощью IIS и использования HTTP Platform Handler для переадресации запросов на Python.

Вопрос в том, как мне получить имя пользователя из предоставленного токена в Python? Токен в заголовке X-IIS-WindowsAuthToken выглядит как шестнадцатеричный код из 3 символов, например 22b.

1 Ответ

1 голос
/ 09 июля 2020

Хорошо, поэтому я немного исследовал это и закончил обзор того, как Microsoft.AspNetCore.Server.IISIntegrateion.AuthenticationHandler сделал это.

Затем, выяснив один способ, я хотел опубликовать этот ответ, так что 1) я найду его позже, 2) по крайней мере, он на SO на случай, если кому-то еще интересно.

Хорошо, поэтому шестнадцатеричное значение - это дескриптор, а с дескриптором мы можем вызовите олицетворение пользователя, затем получите имя пользователя, готово.

Все, что вам нужно, это 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}")
    
    
...