Aktivieren von SSO in nativem Linux mit MSAL-Python

Microsoft Authentication Library (MSAL) (MSAL) ist ein Software Development Kit (SDK), mit dem Apps den Microsoft Single Sign-On bei Linux-Broker aufrufen können, eine Linux-Komponente, die unabhängig von der Linux-Distribution ausgeliefert wird, jedoch mit einem Paket-Manager installiert wird.sudo apt install microsoft-identity-brokersudo dnf install microsoft-identity-broker

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.

Der Broker wird auch als Abhängigkeit von Anwendungen gebündelt, die von Microsoft (z. B. Unternehmensportal) entwickelt wurden. Ein Beispiel für die Installation des Brokers ist, wenn ein Linux-Computer über eine Endpunktverwaltungslösung wie Microsoft Intune bei der Geräteflotte eines Unternehmens registriert wird.

Was ist ein Broker?

Ein Authentifizierungsbroker ist eine Anwendung, die auf dem Computer eines Benutzers ausgeführt wird, der die Authentifizierungs-Handshakes und die Tokenwartung für verbundene Konten verwaltet. Das Linux-Betriebssystem verwendet die Microsoft-Einmalanmeldung für Linux als Authentifizierungsbroker. Es bietet entwicklern und Kunden viele Vorteile, darunter:

  • Ermöglicht einmaliges Anmelden: Ermöglicht Apps die Vereinfachung der Authentifizierung von Benutzern mit Microsoft Entra ID und schützt Microsoft Entra ID Aktualisierungstoken vor Exfiltration und Missbrauch.
  • Verbesserte Sicherheit. Viele Sicherheitsverbesserungen werden mit dem Broker bereitgestellt, ohne die Anwendungslogik aktualisieren zu müssen.
  • Unterstützte Funktionen Mit Hilfe des Brokers können Entwickler auf umfangreiche Betriebssystem- und Dienstfunktionen zugreifen.
  • Systemintegration. Anwendungen, die das Broker-Plug-and-Play mit der integrierten Kontoauswahl verwenden, sodass der Benutzer schnell ein vorhandenes Konto auswählen kann, anstatt die gleichen Anmeldeinformationen immer wieder einzugeben.
  • Tokenschutz. Microsoft einmaliges Anmelden für Linux stellt sicher, dass die Aktualisierungstoken gerätegebunden sind.

Wie kann ich mich für die Verwendung des Brokers anmelden?

  1. In der MSAL-Python-Bibliothek haben wir das enable_broker_on_linux Flag eingeführt, das den Broker sowohl auf WSL als auch auf eigenständigem Linux ermöglicht.
    • Wenn Sie die Brokerunterstützung ausschließlich auf WSL für Azure CLI aktivieren möchten, können Sie den Azure CLI App-Code ändern, um das enable_broker_on_wsl Flag exklusiv auf WSL zu aktivieren.
    • Wenn Sie eine plattformübergreifende Anwendung entwickeln, müssen Sie auch enable_broker_on_windows verwenden, wie im Artikel Using MSAL Python with Web Account Manager beschrieben.
    • Sie können eine beliebige Kombination der folgenden Opt-In-Parameter auf "true" festlegen:
Opt-In-Kennzeichnung Wenn die App ausgeführt wird Die App hat diese URI im Azure-Portal als Umleitungs-URI für die Desktopplattform registriert.
Broker unter Windows aktivieren Windows 10+ ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
enable_broker_on_wsl WSL ms-appx-web://Microsoft. AAD. BrokerPlugin/your_client_id
Broker auf dem Mac aktivieren Mac mit installiertem Unternehmensportal msauth.com.msauth.unsignedapp://auth
enable_broker_on_linux Linux mit Installierter Intune https://login.microsoftonline.com/common/oauth2/nativeclient (MUSS aktiviert sein)
  1. Ihre Anwendung muss brokerspezifische Umleitungs-URIs unterstützen. Insbesondere für Linux muss die URL für die Weiterleitungs-URI wie folgt lauten:

    https://login.microsoftonline.com/common/oauth2/nativeclient
    
  2. 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"
    
  3. Nach der Konfiguration können Sie aufrufen acquire_token_interactive , um ein Token zu erwerben.

    result = app.acquire_token_interactive(["User.ReadBasic.All"],
                        parent_window_handle=app.CONSOLE_WINDOW_HANDLE)
    

Parameter für die Brokerunterstützung

Die folgenden Parameter stehen zum Konfigurieren der Brokerunterstützung in MSAL Python zur Verfügung. Diese Parameter können an den PublicClientApplication Konstruktor oder an die acquire_token_interactive Methode übergeben werden.

Parameters: Typ Description
Broker unter Windows aktivieren boolean Diese Einstellung ist nur wirksam, wenn Ihre App auf Windows 10+ ausgeführt wird. Dieser Parameter ist standardmäßig "None" festgelegt, was bedeutet, dass MSAL keinen Broker verwendet.

New in MSAL Python 1.25.0.
enable_broker_on_wsl boolean Diese Einstellung ist nur wirksam, wenn Ihre App auf WSL ausgeführt wird. Dieser Parameter ist standardmäßig "None" festgelegt, was bedeutet, dass MSAL keinen Broker verwendet.

New in MSAL Python 1.25.0.
Broker auf dem Mac aktivieren boolean Diese Einstellung ist nur wirksam, wenn Ihre App auf dem Mac mit Unternehmensportal installiert wird. Dieser Parameter ist standardmäßig "None" festgelegt, was bedeutet, dass MSAL keinen Broker verwendet.

New in MSAL Python 1.31.0.
enable_broker_on_linux boolean Diese Einstellung ist nur wirksam, wenn Ihre App unter Linux ausgeführt wird, auf der Intune installiert ist. Dieser Parameter ist standardmäßig "None" festgelegt, was bedeutet, dass MSAL keinen Broker verwendet.

New in MSAL Python 1.33.0.
parent_window_handle int OPTIONAL

Hinweise zu parent_window_handle

Der parent_window_handle Parameter ist erforderlich, auch wenn er unter Linux nicht verwendet wird. Bei GUI-Anwendungen wird der Anmeldeaufforderungsspeicherort ad-hoc bestimmt und kann derzeit nicht an ein bestimmtes Fenster gebunden werden. In einem zukünftigen Update wird dieser Parameter verwendet, um das tatsächliche übergeordnete Fenster zu bestimmen.

Zustand Description
App möchte keinen Broker verwenden parent_window_handle muss nicht angegeben werden
Die App entscheidet sich für die Verwendung eines Brokers. parent_window_handle ist erforderlich.
App ist eine GUI-App, die auf Windows- oder Mac-System ausgeführt wird. erforderlich, um das Fensterhandle anzugeben, damit das Anmeldefenster vor Ihrem Fenster angezeigt wird.
App ist eine Konsolen-App, die auf Windows- oder Mac-System ausgeführt wird. kann PublicClientApplication.CONSOLE_WINDOW_HANDLE als Platzhalter verwenden
Die App soll eine plattformübergreifende Anwendung sein. Die App muss enable_broker_on_windows verwenden, wie im Artikel Verwenden von MSAL Python mit Web Account Manager beschrieben.

Die Fallbackverhalten der Brokerunterstützung von MSAL Python

MSAL gibt entweder einen Fehler aus oder greift automatisch auf Nicht-Broker-Flows zurück.

  1. MSAL ignoriert die enable_broker_... und den Broker bei den Authentifizierungsabläufen umgehen, von denen bekannt ist, dass sie NICHT vom Broker unterstützt werden. Dazu gehören ADFS, B2C usw. Weitere Szenarien, in denen ein Broker verwendet werden könnte, finden Sie unten.

  2. MSAL gibt einen Fehler aus, wenn der App-Entwickler sich für die Verwendung eines Brokers entschieden hat, aber das direkte Abhängigkeitspaket „mid-tier“ nicht installiert ist. Fehlermeldung führt App-Entwickler dazu, die richtige Abhängigkeit msal[broker] zu deklarieren. Hier geben wir einen Fehler aus, weil App-Entwickler auf diesen Fehler reagieren können.

  3. MSAL „deaktiviert“ den Broker automatisch und führt ein Fallback auf einen Nicht-Broker aus, wenn dies aktiviert ist und die Abhängigkeit zwar installiert ist, ihre Initialisierung jedoch fehlschlägt. Wir gehen davon aus, dass dies auf einem Gerät geschieht, dessen Betriebssystem zu alt ist oder die zugrunde liegende Brokerkomponente irgendwie nicht verfügbar ist. Hier kann weder ein App-Entwickler noch der Endnutzer viel tun. Schließlich muss die Richtlinie für bedingten Zugriff den Benutzer zwingen, zu einem anderen Gerät zu wechseln.

  4. MSAL gibt einen Fehler aus, wenn der Broker aktiviert, installiert und initialisiert ist, nachfolgende Tokenanforderungen jedoch fehlschlagen.

Important

Wenn Broker-bezogene Pakete nicht installiert sind und Sie versuchen, den Authentifizierungsbroker zu verwenden, erhalten Sie eine Fehlermeldung: ImportError: You need to install dependency by: pip install "msal[broker]>=1.xx,<2".

Note

Der parent_window_handle Parameter ist erforderlich, auch wenn er unter Linux nicht verwendet wird. Bei GUI-Anwendungen wird der Anmeldeaufforderungsspeicherort ad-hoc bestimmt und kann derzeit nicht an ein bestimmtes Fenster gebunden werden. In einem zukünftigen Update wird dieser Parameter verwendet, um das tatsächliche übergeordnete Fenster zu bestimmen.

Zwischenspeichern von Tokens

Der Authentifizierungsbroker verarbeitet das Zwischenspeichern von Aktualisierungs- und Zugriffstoken. Sie müssen keine benutzerdefinierte Zwischenspeicherung einrichten.

Erstellen einer Beispiel-App

Sie finden eine Beispiel-App, die veranschaulicht, wie MSAL Python mit dem Authentifizierungsbroker unter Linux im MSAL-Python GitHub-Repository verwendet wird. Die Beispiel-App befindet sich im samples/console_app Verzeichnis und enthält Beispiele für die Verwendung des Brokers für die Authentifizierung.

App-Registrierung

Aktualisieren Sie Ihre App-Registrierung im Azure-Portal, um die brokerspezifische Umleitungs-URI für Linux hinzuzufügen:

https://login.microsoftonline.com/common/oauth2/nativeclient

Linux-Abhängigkeiten

Überprüfen Sie zunächst, ob Python3 auf Ihrer Linux-Verteilung installiert ist.

python3 --version

Falls nicht, installieren Sie sie mit dem Paket-Manager für Ihre Verteilung.

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

sudo add-apt-repository -y universe
sudo apt update
sudo apt install python3 python3-pip libwebkit2gtk-4.1-dev -y

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"

Projekt erstellen

Nach der Konfiguration können Sie aufrufen acquire_token_interactive , um ein Token zu erwerben.

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"]
# Removed unused variable to avoid confusion


# 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"]))