Включение единого входа в приложения WSL (подсистема Windows для Linux) с помощью MSAL Python и WAM

MSAL может использовать Microsoft Single Sign-on для Linux — компонент для Linux, который поставляется независимо от дистрибутива Linux, однако устанавливается с помощью диспетчера пакетов, используя sudo apt install microsoft-identity-broker или sudo dnf install microsoft-identity-broker.

Этот компонент выступает в качестве брокера аутентификации, позволяя пользователям вашего приложения получать преимущества интеграции с учетными записями, известными Linux, например с учетной записью, с помощью которой вы входите в сеансы Linux в приложениях, использующих этого брокера. Она также упакована как зависимость приложений, разработанных Microsoft, например Корпоративный портал. Эти приложения устанавливаются при регистрации компьютера Linux в парке устройств компании через решение для управления конечными точками, например Microsoft Intune.

Использование брокера аутентификации в Linux позволяет упростить аутентификацию пользователей в вашем приложении через Microsoft Entra ID, а также воспользоваться будущими возможностями, которые защищают маркеры обновления Microsoft Entra ID от кражи и неправомерного использования.

Чтобы включить единый вход (SSO) в вашем приложении WSL с помощью MSAL Python, необходимо убедиться, что хранилище ключей настроено и разблокировано, так как MSAL использует libsecret для взаимодействия с демоном хранилища ключей.

Пример потока проверки подлинности WSL

В ситуации, когда у вас есть приложение WSL, которое должно пройти проверку подлинности с помощью Microsoft Entra ID, поток проверки подлинности для интерактивного запроса будет выглядеть следующим образом:

Процесс аутентификации в среде WSL

Обновление до последней версии WSL

Убедитесь, что вы обновились до последнего выпуска WSL. Диалоговое окно управления учетными записями WAM поддерживается в WSL версии 2.4.13 и выше.

# To check what distros are available:
wsl.exe --list --online

wsl.exe --install Ubuntu-22.04

# To check the WSL version:
wsl --version

# To update WSL:
wsl --update

Зависимости пакетов Linux

Установите следующие зависимости на платформе Linux:

  • libsecret-tools требуется для интерфейса с цепочкой ключей Linux

Чтобы установить дистрибутив Linux на основе debian/Ubuntu, выполните приведенные далее действия.

sudo add-apt-repository -y universe
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev libsecret-1-0  -y

#from Powershell, run
wsl.exe --shutdown

Important

Чтобы цепочка ключей работала должным образом, необходимо убедиться, что вы 1. установите зависимости, 2. Перезагрузить/перезапустить WSL, 3. Настройте цепочку ключей. Если не выполнить шаги в правильной последовательности, в связке ключей будет отсутствовать параметр «Связка ключей паролей».

Настройте связку ключей в WSL

MSAL использует libsecret в Linux. Требуется взаимодействие с демоном keyring. Пользователи могут использовать Seahorse (приложение GNOME для управления ключами шифрования и паролями) для управления keyring содержимым с помощью графического пользовательского интерфейса (GUI).

В дистрибутивах на основе Debian можно установить пакет, выполнив команду sudo apt install seahorse, а затем следуя этим инструкциям:

  1. Запуск seahorse в терминале в качестве обычного пользователя (а не как sudo)

    Диалоговое окно цепочки ключей по умолчанию

  2. В левом верхнем углу выберите + и создайте связку ключей Password.

    диалог выбора связки ключей для паролей

  3. Создайте связку ключей с именем «login»

    ввод имени входа в запрос

  4. Задайте пароль в следующем диалоговом окне. выбор пароля и подтверждение

  5. Запустите wsl.exe --shutdown из Терминал Windows.

  6. Запустите новый сеанс WSL и запустите пример. У вас будет запрошен пароль от связки ключей.

Запуск примера приложения

Чтобы использовать брокер на платформе Linux, убедитесь, что для BrokerOptions установлено значение OperatingSystems.Linux, как показано в приведённом ниже фрагменте кода:

Сведения о настройке проекта см. в статье Включение единого входа в собственных Linux-приложениях с помощью MSAL Python.

Зависимости Python

Чтобы использовать брокер, вам потребуется установить связанные с брокером пакеты в дополнение к базовому пакету MSAL из PyPI:

pip install "msal[broker]>=1.33.0b1,<2"

Запуск примера приложения

После настройки можно вызвать acquire_token_interactive, чтобы получить токен. Сохраните следующее как wsl_broker.py.

import sys  # For simplicity, we'll read config file from 1st CLI param sys.argv[1]
import json
import logging
import requests
import msal

# Optional logging
# logging.basicConfig(level=logging.DEBUG)

var_authority = "https://login.microsoftonline.com/common"
var_client_id = " your-client-id-here"  # Replace with your app's client ID
var_username = "your-username-here"  # Replace with your username, e.g., "
var_scope = ["User.ReadBasic.All"]

# Create a preferably long-lived app instance which maintains a token cache (Default cache is in memory only).
app = msal.PublicClientApplication(
    var_client_id, 
    authority=var_authority,
    enable_broker_on_windows=True,
    enable_broker_on_wsl=True
    )

# The pattern to acquire a token looks like this.
result = None

# Firstly, check the cache to see if this end user has signed in before
accounts = app.get_accounts(username=var_username)
if accounts:
    logging.info("Account(s) exists in cache, probably with token too. Let's try.")
    result = app.acquire_token_silent(var_scope, account=accounts[0])

if not result:
    logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
    
    result = app.acquire_token_interactive(var_scope,parent_window_handle=app.CONSOLE_WINDOW_HANDLE)
    
if "access_token" in result:
    print("Access token is: %s" % result['access_token'])

else:
    print(result.get("error"))
    print(result.get("error_description"))
    print(result.get("correlation_id"))  # You may need this when reporting a bug
    if 65001 in result.get("error_codes", []):  # Not mean to be coded programatically, but...
        # AAD requires user consent for U/P flow
        print("Visit this to consent:", app.get_authorization_request_url(config["scope"]))

Запустите пример

Запустите пример приложения с помощью следующей команды:

python wsl_broker.py

Появится запрос:

  • введите имя пользователя и учетные данные
  • введите пароль для ввода ключа
  • затем приложение получит маркер и распечатает его в консоли.