Výzvy podmíněného přístupu a deklarací identity

Background

Při tichém získávání tokenů může vaše aplikace obdržet chybové zprávy, pokud rozhraní API, ke kterému se pokoušíte získat přístup, vyžaduje výzvu k deklaracím identity v rámci podmíněného přístupu, například kvůli zásadám vícefaktorového ověřování.

Vzor pro zpracování této chyby spočívá v interaktivním získání tokenu pomocí knihovny MSAL. Interaktivní získání tokenu vyzve uživatele a poskytne mu možnost splnit požadované zásady podmíněného přístupu.

Note

Existují některé zásady podmíněného přístupu, které nevyžadují interakci uživatele, aby bylo možné vyhovět zásadě. V takových případech se doporučuje použít metodu acquire_token_silent ke zpracování vrácené výzvy claims a zabránit vyžadování interakce uživatele.

V některých případech můžete při volání rozhraní API, které vyžaduje podmíněný přístup, obdržet v chybové odpovědi z rozhraní API výzvu deklarací. Pokud například zásada podmíněného přístupu vyžaduje spravované zařízení (Intune), chybová zpráva bude vypadat přibližně takto: AADSTS53000: Aby bylo možné získat přístup k tomuto prostředku, musí být vaše zařízení spravované nebo podobně. V takovém případě můžete ve volání pro získání tokenu předat claims, aby byl uživatel vyzván ke splnění příslušných zásad.

Zpracování výzvy deklarace identity v Python MSAL

Při volání rozhraní API, které vyžaduje podmíněný přístup, bude vaše aplikace muset zpracovat chybu výzvy k deklaraci identity. To se zobrazí jako chybová odpověď knihovny MSAL Python, v níž vlastnost Claims nebude prázdná.

Abyste mohli zpracovat ověřovací výzvu deklarace identity, budete muset použít parametr claims_challenge metody get_authorization_request_url(). V případech, které nevyžadují interakce, budete muset použít claims_challenge parametr v acquire_token_silent() metodě a metoda použije obnovovací token k získání nového tokenu.

Výzva deklarací identity je direktiva v hlavičce www-authenticate , se kterou bude poskytovatel prostředků (např. MS Graph) reagovat, pokud přístupový token není autorizovaný a vyžaduje se nový přístupový token. Příklad výzvy deklarací identity od poskytovatele prostředků (např. MS Graph) by měl vypadat takto. Skládá se ze stavového kódu HTTP, který musí být 401 a hlavička www-authenticate , která obsahuje pole uvedená výše.

HTTP 401; Unauthorized 
www-authenticate=Bearer realm="", 
authorization_uri="https://login.microsoftonline.com/common/oauth2/authorize", 
error="insufficient_claims", 
claims="returned_claims"

Klienti musí extrahovat claimy a poté je předat metodě acquire_token_by_*. Pokud je hodnota claims vrácená z prostředku zakódovaná v kódování Base64, je nutné ji před voláním knihovny MSAL dekódovat. Metody acquire_token v MSAL přijímají claims ve formě řetězce JSON. Toto je příklad toho, jak lze claimy vrácené poskytovatelem prostředku zpracovat pomocí autorizačního toku s kódem.

claims_challenge = "claims returned from resource provider"
# if claims parameter is encoded, decode it and use the decoded claims
# decoded_claims_challenge = str(base64.b64decode(claims), "utf-8")

result = None

# Since you were using your previous AT and then met a claims challenge,
# you should've already be in a context with the current signed-in user.
# Here we assume you somehow already have that account,
# or you could possibly get it like this:
accounts = app.get_accounts()
assert accounts
account = accounts[0]

result = app.acquire_token_silent(scope, account=account, claims_challenge=claims_challenge)
if not result:
    # Auth endpoint call for interactive login (you can use auth url helper)
    auth_url = app.get_authorization_request_url(..., claims_challenge=claims_challenge)
    # Make a request to this auth_url to get back authorization_code
    result = app.acquire_token_by_authorization_code(..., claims_challenge=claims_challenge)
  • Tento nový přístupový token se teď dá použít v požadavku na prostředek.