Aktivera SSO nativt i Linux med MSAL Python

Microsofts autentiseringsbibliotek (MSAL) är ett programvaruutvecklingspaket (SDK) som gör det möjligt för appar att anropa Microsoft-brokern för enkel inloggning i Linux, en Linux-komponent som distribueras oberoende av Linux-distributionen, men som installeras med hjälp av en pakethanterare med sudo apt install microsoft-identity-broker eller sudo dnf install microsoft-identity-broker.

Den här komponenten fungerar som en autentiseringsförmedlare, vilket gör att användarna av din app kan dra nytta av integration med konton som Linux känner till, till exempel kontot som du loggade in i dina Linux-sessioner med, för appar som använder förmedlaren.

Brokern medföljer också som ett beroende i program som utvecklats av Microsoft (till exempel Company Portal)). Ett exempel på när brokern installeras är när en Linux-dator registreras i ett företags enhetspark via en lösning för slutpunktshantering som Microsoft Intune.

Vad är en mäklare

En autentiseringskoordinator är ett program som körs på en användares dator som hanterar handskakningar för autentisering och tokenunderhåll för anslutna konton. Linux-operativsystemet använder Microsofts single sign-on för Linux som autentiseringsförmedlare. Det har många fördelar för både utvecklare och kunder, bland annat:

  • Aktiverar enkel inloggning: gör det möjligt för appar att förenkla hur användare autentiserar med Microsoft Entra ID och skyddar Microsoft Entra ID uppdateringstoken från exfiltrering och missbruk
  • Förbättrad säkerhet. Många säkerhetsförbättringar levereras med mäklaren, utan att applikationslogiken behöver uppdateras.
  • Funktionsstöd. Med hjälp av brokern kan utvecklare få tillgång till rika OS- och tjänstfunktioner.
  • Systemintegrering. Program som använder plugin-programmet broker med den inbyggda kontoväljaren, så att användaren snabbt kan välja ett befintligt konto i stället för att ange samma autentiseringsuppgifter om och om igen.
  • Tokenskydd. Microsoft enkel inloggning för Linux säkerställer att uppdateringstokenen är bundna till enheten.

Så här väljer du att använda brokern

  1. I MSAL Python-biblioteket har vi introducerat flaggan enable_broker_on_linux, som aktiverar förmedlaren för både WSL och fristående Linux-system.
    • Om målet är att endast aktivera brokerstöd på WSL för Azure CLI kan du överväga att ändra Azure CLI-appens kod för att aktivera flaggan enable_broker_on_wsl endast på WSL.
    • Om du skriver ett plattformsoberoende program måste du också använda enable_broker_on_windows, enligt beskrivningen i artikeln Using MSAL Python with Web Account Manager (Använda MSAL-Python med Web Account Manager).
    • Du kan ange valfri kombination av följande anmälningsparametrar till true:
Anmäl dig-flagga Om appen kommer att köras på Appen har registrerat detta som en omdirigerings-URI för skrivbordsplattform i Azure Portal
aktivera mäklare i Windows 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
enable_broker_on_mac Mac med Company Portal installerat msauth.com.msauth.unsignedapp://auth
aktivera mäklaren på Linux Linux med Intune installerat https://login.microsoftonline.com/common/oauth2/nativeclient (MÅSTE vara aktiverat)
  1. Ditt program måste ha stöd för brokerspecifika omdirigerings-URI:er. Specifikt för Linux måste URL:en för omdirigerings-URI:n vara:

    https://login.microsoftonline.com/common/oauth2/nativeclient
    
  2. För att använda brokern måste du installera de brokerrelaterade paketen utöver MSAL-kärnpaketet från PyPI:

    pip install "msal[broker]>=1.33.0b1,<2"
    
  3. När du har konfigurerat kan du anropa acquire_token_interactive för att hämta en token.

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

Parametrar för meddelandeförmedlarstöd

Följande parametrar är tillgängliga för att konfigurera stöd för koordinatorer i MSAL Python. Dessa parametrar kan skickas till PublicClientApplication konstruktorn eller till acquire_token_interactive -metoden.

Parameters: Type Description
aktivera mäklare i Windows boolean Den här inställningen gäller bara om appen körs på Windows 10+. Den här parametern har standardvärdet None, vilket innebär att MSAL inte kommer att använda en broker.

New in MSAL Python 1.25.0.
enable_broker_on_wsl boolean Den här inställningen gäller bara om din app körs på WSL. Den här parametern har standardvärdet None, vilket innebär att MSAL inte kommer att använda en broker.

New in MSAL Python 1.25.0.
enable_broker_on_mac boolean Den här inställningen gäller bara om appen körs på Mac med Company Portal installerat. Den här parametern har standardvärdet None, vilket innebär att MSAL inte kommer att använda en broker.

New in MSAL Python 1.31.0.
aktivera mäklaren på Linux boolean Den här inställningen gäller endast om din app körs på Linux med Intune installerat. Den här parametern har standardvärdet None, vilket innebär att MSAL inte kommer att använda en broker.

New in MSAL Python 1.33.0.
parent_window_handle int Valfritt

Anteckningar om parent_window_handle

Parametern parent_window_handle krävs även om den inte används i Linux. För GUI-program bestäms platsen för inloggningsprompten ad hoc och kan för närvarande inte bindas till ett specifikt fönster. I en framtida uppdatering används den här parametern för att fastställa det faktiska överordnade fönstret.

Tillstånd Description
Appen vill inte använda en broker du behöver inte ange en parent_window_handle
Appen väljer att använda en förmedlare parent_window_handle är obligatoriskt
Appen är en GUI-app som körs på Windows- eller Mac-system måste ange sitt fönsterhandtag så att inloggningsfönstret visas ovanpå ditt fönster
App är en konsolapp som körs på Windows- eller Mac-system kan använda en platshållare PublicClientApplication.CONSOLE_WINDOW_HANDLE
Appen är avsedd att vara ett plattformsoberoende program Appen måste använda enable_broker_on_windows, enligt beskrivningen i artikeln Using MSAL Python with Web Account Manager (Använda MSAL-Python med Web Account Manager).

Reservbeteenden för brokerstödet i MSAL Python

MSAL returnerar antingen ett fel eller faller tyst tillbaka till icke-brokerflöden.

  1. MSAL kommer att ignorera enable_broker_… och kringgå brokern för de autentiseringsflöden som man vet INTE stöds av brokern. Detta inkluderar ADFS, B2C osv. För andra scenarier där en broker skulle kunna användas, se nedan.

  2. MSAL ger ett fel när apputvecklaren har valt att använda en broker men ett direkt beroende, ”mellanskiktspaketet”, inte är installerat. Felmeddelandet vägleder apputvecklaren att deklarera rätt beroende msal[broker]. Här genererar vi ett fel eftersom apputvecklare kan vidta åtgärder utifrån felet.

  3. MSAL "inaktiverar" tyst brokern och återgår till icke-broker när detta har aktiverats och beroendet är installerat men inte kan initieras. Vi förväntar oss att detta skulle inträffa på en enhet vars operativsystem är för gammalt eller om den underliggande koordinatorkomponenten på något sätt inte är tillgänglig. Det finns inte mycket en apputvecklare eller slutanvändaren kan göra här. Slutligen ska principen för villkorlig åtkomst tvinga användaren att byta till en annan enhet.

  4. MSAL ger ett fel när broker har aktiverats, installerats och initierats, men efterföljande tokenbegäranden misslyckades.

Important

Om broker-relaterade paket inte är installerade och du kommer att försöka använda autentiseringskoordinatorn får du ett fel: ImportError: You need to install dependency by: pip install "msal[broker]>=1.xx,<2".

Note

Parametern parent_window_handle krävs även om den inte används i Linux. För GUI-program bestäms platsen för inloggningsprompten ad hoc och kan för närvarande inte bindas till ett specifikt fönster. I en framtida uppdatering används den här parametern för att fastställa det faktiska överordnade fönstret.

Cachelagring av token

Autentiseringskoordinatorn hanterar cachelagring av uppdaterings- och åtkomsttoken. Du behöver inte konfigurera anpassad cachelagring.

Skapa en exempelapp

Du hittar en exempelapp som visar hur du använder MSAL Python med autentiseringskoordinatorn i Linux på MSAL-Python GitHub-lagringsplatsen. Exempelappen finns i katalogen samples/console_app och innehåller exempel på hur man använder mäklaren för autentisering.

Appregistrering

Uppdatera din appregistrering i Azure-portalen så att den innehåller den mäklarspecifika omdirigerings-URI:n för Linux:

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

Linux-beroenden

Kontrollera först om du har Python3 installerat på din Linux-distribution.

python3 --version

Annars installerar du den med hjälp av pakethanteraren för distributionen.

Så här installerar du på debian/Ubuntu-baserad Linux-distribution:

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

Python-beroenden

För att använda brokern måste du installera de brokerrelaterade paketen utöver MSAL-kärnpaketet från PyPI:

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

Skapa projekt

När du har konfigurerat kan du anropa acquire_token_interactive för att hämta en token.

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