8 mai 2024

Blazor Server, utilisez ProtectedSessionStorage

Avec la sortie ASP.NET Core updates in .NET 5 Preview 8, deux nouvelles fonctions font leurs apparitions : ProtectedLocalStorage et ProtectedSessionStorage.

Jusqu’à présent j’utilisais la superbe librarie de Chris Sainty : Blazored SessionStorage qui fait parfaitement son boulot ! Maintenant avec ses nouvelles fonctions disponibles, on va pouvoir ajouter un grain de sécurité aux variables stockées dans le navigateur. L’avantage est que l’utilisation est très simple, vos variables seront illisibles et vous pourrez détecter lors de leur lecture si elles ont été altérées !

Mise en place :

Dans un premier temps, il faut upgrader le projet en .NET 5 Preview 8 (ou plus si vous lisez mon post dans le futur 😁):

1) Mettez à niveau :

  • Microsoft.AspNetCore.* package references → 5.0.0-preview.8.*. ou +
  • Microsoft.Extensions.* package references → 5.0.0-preview.8.*. ou +
  • System.Net.Http.Json package references → 5.0.0-preview.8.*. ou +

2) Ensuite, ajoutez le paquet Nuget Microsoft.AspNetCore.Components.ProtectedBrowserStorage

3) Puis, dans startup.cs à ConfigureServices, ajoutez :

services.AddProtectedBrowserStorage();

4) Enfin dans _Imports.razor, ajouter :

@using Microsoft.AspNetCore.Components.ProtectedBrowserStorage

LocalStorage ou SessionStorage

C’est comme vous voulez mais la différence est là selon votre besoin  :

Local Storage Session Storage
Capacité 10Mo 5Mo
Accessible depuis Tous les onglets L’onglet actif
Expiration Jamais A la fermeture de l’onglet

Dans mon cas je vais utiliser SessionStorage :

Stocker une variable

@inject ProtectedSessionStorage protectedSessionStorage

// code HTML

@code
{
protected override async Task OnInitializedAsync()
{
await protectedSessionStorage.SetAsync("userToken", mytoken);
}
}

Attention, n’écrivez pas une variable int par exemple directement, cela plantera à la lecture ; Ajoutez .ToString()

Lire une variable

@inject ProtectedSessionStorage protectedSessionStorage

// code HTML

@code
{
protected override async Task OnInitializedAsync()
{
ProtectedBrowserStorageResult<string> toto = await protectedSessionStorage.GetAsync<string>("userToken");
if (toto.Success)
{
string mytoken = toto.Value;
}
else
{
// Demander gentiment à l'utilisateur de quitter votre application
}
}
}

variable dans le browser

On le voit, le gros avantage est que la variable est illisible et si elle est altérée pour une raison ou pour une autre vous pouvez gérer votre code comme bon vous semble.

Laisser un commentaire