Aktivieren von SSO in WSL-Apps (Windows-Subsystem für Linux) mit MSAL-Python und WAM

MSAL kann Microsoft Single Sign-On für Linux aufrufen, eine Linux-Komponente, die unabhängig von der Linux-Distribution bereitgestellt wird, jedoch mithilfe eines Paket-Managers über sudo apt install microsoft-identity-broker oder sudo dnf install microsoft-identity-broker installiert wird.

Diese Komponente fungiert als Authentifizierungsbroker, sodass die Benutzer Ihrer App von der Integration mit Konten profitieren können, die Linux bekannt sind – z. B. von dem Konto, mit dem Sie sich bei Ihren Linux-Sitzungen angemeldet haben, für Apps, die Daten vom Broker beziehen. Es wird auch als Abhängigkeit von Anwendungen gebündelt, die von Microsoft entwickelt wurden, z. B. Unternehmensportal. Diese Anwendungen werden installiert, wenn ein Linux-Computer in der Geräteflotte eines Unternehmens über eine Endpunktverwaltungslösung wie Microsoft Intune registriert wird.

Mithilfe eines Authentifizierungsbrokers unter Linux können Sie vereinfachen, wie Sich Ihre Benutzer mit Microsoft Entra ID von Ihrer Anwendung authentifizieren und zukünftige Funktionen nutzen, die Microsoft Entra ID Aktualisierungstoken vor Exfiltration und Missbrauch schützen.

Um SSO in Ihrer WSL-App mit MSAL für Python zu aktivieren, müssen Sie sicherstellen, dass der Schlüsselbund eingerichtet und entsperrt ist, da MSAL libsecret verwendet, um mit dem Keyring-Daemon zu kommunizieren.

Beispiel für den WSL-Authentifizierungsfluss

In einer Situation, in der Sie über eine WSL-App verfügen, die sich mit Microsoft Entra ID authentifizieren muss, würde der Authentifizierungsfluss für eine interaktive Anforderung wie folgt aussehen:

Authentifizierungsfluss aus WSL

Aktualisieren auf die neueste Version von WSL

Stellen Sie sicher, dass Sie auf die neueste WSL-Version aktualisiert haben. Das Dialogfeld "WAM-Kontosteuerung" wird in WSL-Versionen 2.4.13 und höher unterstützt.

# 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-Paketabhängigkeiten

Installieren Sie die folgenden Abhängigkeiten auf Ihrer Linux-Plattform:

  • libsecret-tools ist erforderlich, um eine Schnittstelle mit dem Linux-Schlüsselbund zu erstellen.

Zur Installation auf Debian-/Ubuntu-basierten Linux-Distributionen:

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

Damit der Schlüsselbund wie vorgesehen funktioniert, sollten Sie sicherstellen, dass Sie Folgendes tun: 1. 2. Installieren Sie die Abhängigkeiten. WSL neu starten, 3. Konfigurieren Sie den Schlüsselbund. Wenn die Schritte nicht in der richtigen Reihenfolge ausgeführt werden, fehlt im Schlüsselbund die Option „Kennwortschlüsselbund“.

Keyring in WSL einrichten

MSAL verwendet libsecret unter Linux. Es ist erforderlich, mit dem keyring Daemon zu kommunizieren. Benutzer können Seahorse (eine GNOME-Anwendung zum Verwalten von Verschlüsselungsschlüsseln und Kennwörtern) verwenden, um den Inhalt von keyring über eine grafische Benutzeroberfläche (GUI) zu verwalten.

Auf Debian-basierten Distributionen können Sie das Paket installieren, indem Sie das Paket ausführen sudo apt install seahorse und dann den folgenden Anweisungen folgen:

  1. Führen Sie seahorse im Terminal als regulärer Benutzer aus (nicht mit sudo).

    Standard-Schlüsselbund-Dialog

  2. Wählen Sie in der oberen linken Ecke + aus und erstellen Sie den Passwort-Schlüsselbund.

    Dialogfeld zur Auswahl des Passwort-Schlüsselbunds

  3. Erstellen eines Schlüsselrings mit dem Namen "Login"

    login an der Eingabeaufforderung eingeben

  4. Legen Sie das Kennwort im nächsten Dialogfeld fest. Auswählen eines Kennworts und Bestätigen

  5. Führen Sie wsl.exe --shutdown in Ihrem Windows-Terminal aus.

  6. Starten Sie eine neue WSL-Sitzung, und führen Sie das Beispiel aus. Sie sollten nach dem Schlüsselringkennwort gefragt werden.

Ausführen einer Beispiel-App

Um einen Broker auf der Linux-Plattform zu verwenden, stellen Sie sicher, dass Sie die BrokerOptionsOperatingSystems.Linux Einstellung wie im folgenden Codeausschnitt gezeigt festlegen:

Verweisen Sie auf das Aktivieren von SSO in systemeigenen Linux-Apps mit MSAL-Python, um Informationen zur Konfiguration des Projekts zu erfahren.

Python Abhängigkeiten

Um den Broker zu verwenden, müssen Sie die brokerbezogenen Pakete zusätzlich zum Kern-MSAL von PyPI installieren:

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

Ausführen der Beispiel-App

Nach der Konfiguration können Sie aufrufen acquire_token_interactive , um ein Token zu erwerben. Speichern Sie Folgendes unter 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"]))

Beispiel ausführen

Führen Sie die Beispiel-App mit dem folgenden Befehl aus:

python wsl_broker.py

Es sollte eine Eingabeaufforderung angezeigt werden:

  • Geben Sie Ihren Benutzernamen/Ihre Anmeldeinformationen ein.
  • Geben Sie Ihr Schlüsselbund-Passwort ein.
  • anschließend erhält die App ein Token und druckt es in die Konsole.