Laden...

Wie kann eine Blazor WASM mit IdentityServer4 den Token im Localstorage abspeichern?

Erstellt von Khalid vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.145 Views
Khalid Themenstarter:in
3.511 Beiträge seit 2005
vor 3 Jahren
Wie kann eine Blazor WASM mit IdentityServer4 den Token im Localstorage abspeichern?

Moin zusammen,

ich beschäftige mich seit geraumer Zeit mit Blazor und bin jetzt an dem Punkt angekommen, meine Test-Anwendung gegen einen IdentityServer4 zu authorisieren. Das funktioniert sogar auch problemlos. Allerdings stoße ich gerade auf ein Problem, zu dem ich nichts finde, oder ich einfach nur falsch verstehe.

Also, wenn der JWT Token vom ID4 zurückgeliefert wird, wird diese Information in den Session Storage geschrieben. Sprich, wenn ich den Browsertab schließe und einen neuen öffne, muss ich mich erneut einloggen. Das ist natürlich später für die User nicht tragbar. Blazor nutzt im Hintergrund die oidc-client.js Library. In einer vorherigen Test-Anwendung über vuejs konnte man in den UserSettings des oidc-clients den userStore mit angeben:


"userStore": new WebStorageStateStore( { store: localStorage }

Diese Möglichkeit scheint es innerhalb von Blazor nicht zu geben. Innerhalb der BlazorApp initialisiere ich die Services via


builder.Services.AddApiAuthorization(x => x.ProviderOptions.ConfigurationEndpoint = "oidc.json");

In der oidc.json stehen alle weiteren Metainformationen


{
  "authority": "https://localhost:5000",
  "client_id": "blazor",
  "redirect_uri": "http://localhost:5001/authentication/login-callback",
  "post_logout_redirect_uri": "http://localhost:5001/authentication/login-callback",
  "response_type": "code",
  "scope": "openid profile email",
  "userStore": "new WebStorageStateStore({ store: localStorage})" // das geht hier so natürlich nicht
}

Hier kann der userStore nicht überschrieben werden, da es hier ja als String interpretiert wird.

Weiß irgendwer, wie ich Blazor (bzw. den oidc-client dahinter) dazu verdonnere, den localStorage zu verwenden anstatt den sessionStorage? Oder macht man das erst gar nicht? Und wenn ja, wie schaffe ich es das der User sich nicht jedesmal neu anmelden muss?

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

16.806 Beiträge seit 2008
vor 3 Jahren

Die Metainformationen kommen von Remote, zB vom Server.
Es ist ja nur Optional, dass man das auch lokal anpassen kann.

Daher macht der User Store in den Konfigurationen kein Sinn, da das Protokoll ja Technologie-neutral ist.

Ich hab nun schon paar Wochen kein Blazor nicht gemacht, aber ich kenne es noch so, dass man den ILocalStorageService verwendet und der Token hier persistiert wird.
In anderen Fällen habe ich auch schon eigen geschriebene Storage- oder StateProvider auf Basis vom AuthenticationStateProvider gesehen.

Man muss bei Blazor bedenken, dass das Framework zwar ASP.NET sehr ähnelt, aber im Endeffekt muss man das wie eine Deskop Applikation, die im Browser läuft, programmieren.

Khalid Themenstarter:in
3.511 Beiträge seit 2005
vor 3 Jahren

Moin,

so, ich hab mir das jetzt alles mal versucht weiter detailliert anzuschauen. Sobald man eine eigene Implementierung des AuthenticationStateProviders in die Services legt und gleichzeitig die von MS zur Verfügung stehenden Extensions "AddApiAuthorization" oder "AddOidcAuthorization" verwendet, knallt es an jeder Ecke. Scheinbat castet er im Hintergrund immer auf die von ihm eigentlich injizierte Instanz des AuthenticationStateProviders.

Auch wenn es wahrscheinlich bekloppt ist, habe ich jetzt angefangen eine eigene Implementierung rund um die oidc-client Library zu schreiben und nicht die von MS bereitgestellten Mittel zu verwenden.

Aber da es eh meine ersten Gehversuche in Blazor sind, ist das ein ganz nettes kleines Projekt um besser die Mechaniken in Blazor zu verstehen.

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)