Abilitare l'accesso SSO nelle app WSL (sottosistema Windows per Linux) usando MSAL Python e WAM

MSAL è in grado di richiamare il Single Sign-On di Microsoft per Linux, un componente Linux distribuito separatamente dalla distribuzione Linux; tuttavia, viene installato tramite un gestore di pacchetti usando sudo apt install microsoft-identity-broker o sudo dnf install microsoft-identity-broker.

Questo componente funge da broker di autenticazione, consentendo agli utenti della tua app di beneficiare dell'integrazione con gli account riconosciuti da Linux, ad esempio l'account usato per accedere alle sessioni Linux per le app che utilizzano il broker. Viene anche raggruppata come dipendenza di applicazioni sviluppate da Microsoft, ad esempio Portale aziendale. Queste applicazioni vengono installate quando un computer Linux viene registrato nella flotta di dispositivi di una società tramite una soluzione di gestione degli endpoint come Microsoft Intune.

L'uso di un broker di autenticazione in Linux consente di semplificare l'autenticazione degli utenti con Microsoft Entra ID dall'applicazione e sfruttare le funzionalità future che proteggono Microsoft Entra ID token di aggiornamento dall'esfiltrazione e dall'uso improprio.

Per abilitare l'accesso SSO nell'app WSL usando MSAL Python, è necessario assicurarsi che il keychain sia configurato e sbloccato, perché MSAL usa libsecret per comunicare con il daemon di keyring.

Esempio di flusso di autenticazione WSL

In una situazione in cui si dispone di un'app WSL che deve eseguire l'autenticazione con Microsoft Entra ID, il flusso di autenticazione per una richiesta interattiva sarà simile al seguente:

Flusso di autenticazione dall'interno di WSL

Eseguire l'aggiornamento alla versione più recente di WSL

Assicurarsi di aver eseguito l'aggiornamento alla versione più recente di WSL. La finestra di dialogo Controllo account WAM è supportata nelle versioni WSL 2.4.13 e successive.

# 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

Dipendenze dei pacchetti Linux

Installare le dipendenze seguenti nella piattaforma Linux:

  • libsecret-tools è necessario per interfacciarsi con il keychain Linux

Per eseguire l'installazione in una distribuzione Linux basata su 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

Importante

Affinché il portachiavi funzioni come previsto, assicurati di 1. installare le dipendenze, 2. Riavviare/reinizializzare WSL, 3. Configurare il portachiavi. Se non si eseguono i passaggi nell'ordine corretto, il keychain non contiene l'opzione "Portachiavi password".

Configurare il portachiavi in WSL

MSAL usa libsecret in Linux. È necessario comunicare con il keyring daemon. Gli utenti possono usare Seahorse (un'applicazione GNOME per la gestione delle chiavi di crittografia e delle password) per gestire i contenuti di keyring tramite un'interfaccia utente grafica (GUI).

Nelle distribuzioni basate su Debian è possibile installare il pacchetto eseguendo sudo apt install seahorse e seguendo queste istruzioni:

  1. Eseguire seahorse nel terminale come utente normale (non come sudo)

    finestra di dialogo portachiavi predefinita

  2. Nell'angolo in alto a sinistra, seleziona + e crea il portachiavi Password.

    Finestra di dialogo keychain che seleziona il keyring della password

  3. Crea un keyring denominato 'login'

    digitando l'accesso nel prompt

  4. Impostare la password nella finestra di dialogo successiva. selezione di una password e conferma

  5. Esegui wsl.exe --shutdown nel Terminale di Windows.

  6. Avviare una nuova sessione WSL ed eseguire l'esempio. Ti dovrebbe essere richiesta la password del keyring.

Eseguire un'app di esempio

Per usare un broker sulla piattaforma Linux, assicurarsi di impostare BrokerOptions su OperatingSystems.Linux come illustrato nel frammento di codice seguente:

Fare riferimento a Enable SSO in native Linux apps using MSAL Python per informazioni su come configurare il progetto.

Dipendenze di Python

Per usare il broker, è necessario installare i pacchetti correlati al broker oltre al core MSAL da PyPI:

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

Esegui l'app di esempio

Dopo la configurazione, è possibile chiamare acquire_token_interactive per acquisire un token. Salvare quanto segue come 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"]))

Eseguire l'esempio

Eseguire l'app di esempio usando il comando seguente:

python wsl_broker.py

Verrà visualizzato un prompt per:

  • immettere il nome utente/le credenziali
  • Inserisci la password del portachiavi
  • l'app acquisirà quindi un token e lo stamperà nella console