Pokud jste si (podobně jako já) slibovali, že „snadno“ vytvoříte Blazor aplikaci, která bude napojitelná na obecného OIDC identity-providera pomocí knihovny Microsoft.AspNetCore.Components.WebAssembly.Authentication
, přičemž budete zároveň touto cestou podporovat i napojení na Azure Active Directory (AAD), zklamu vás.
Myšlenka je jednoduchá, AAD přeci podporuje OIDC a tedy nyní důvod, proč by obecný OIDC klient neměl jít připojit i na AAD. Bohužel překážek je více, než byste chtěli překonávat.
Knihovna Microsoft.Authentication.WebAssembly.Msal
, která je pro AAD určená, je sice nadstavbou základní Microsoft.AspNetCore.Components.WebAssembly.Authentication
knihovny, dělá toho však o dost více, než jenom boilerplate konfiguraci podkladového obecného OIDC.
Základní rozdíl můžete najít například v „interop“ části s podkladovým JavaScriptovým modulem oidc-client
.
AuthenticationService.ts
v Microsoft.AspNetCore.Components.WebAssembly.Authentication,AuthenticationService.ts
v Microsoft.Authentication.WebAssembly.Msal.
Projevuje se to například při vyzvedávání access-tokenů. MSAL verze „fixuje“ specifikum AAD, které při dotazech na token
endpoint ne vždy vrátí access-token se všemi požadovanými scopes (detaily jsou na širší diskuzi, ale např. nedostanete token, který by v sobě měl User.Read
scope společně s custom-scope vašeho API, atp.).
Základní knihovna využívá „cachování“ tokenů v UserManageru oidc-client
a spoléhá se na předpoklad: „Pokud token
-endpoint vrátil access-token, pak tento token v sobě má všechny požadované scopes.“ (tedy si k získanému tokenu požadované scopes uloží a pak při dalším požadavku na stejné scopes vrací již získaný token).
„Fixovaná“ knihovna MSAL tento nedostatek podkladového oidc-client
zná a ví, že tento sice tvrdí, že má token pro nějakou sadu scopes, ale access-token ve skutečnosti tyto scopes mít nemusí. Proto „vypíná“ na této úrovni cachování a získává token vždy znovu.