Il blog di Sandro Rizzetto

Come ottenere lo User in una app Blazor Server Side

 

Nel template di esempio di un sisto Blazor Server Side con autenticazione tramite Identity possiamo vedere come accedere alle proprietà dello user tramite un oggetto context che è disponibile direttamente nel componente razor (quindi nella pagina).

Nel File LoginDisplay.razor troviamo infatti un esempio in cui viene stampato il nome dell’utente loggato corrente

Hello, @context.User.Identity.Name!

Come facciamo però se lo vogliamo nel codebehind (classe pagina.razor.cs che eredita da ComponentBase) ad esempio per passarlo al metodo di un nostro servizio?

Su molti siti o forum a questa domanda viene data come soluzione l’uso di httpContextAccessor che andiamo ad aggiungere in startup.cs con un services.AddHttpContextAccessor(); e che useremo

[Inject] IHttpContextAccessor HttpContextAccessor { get; set; }


protected override async Task OnInitializedAsync()
{
       Tours = await TourService.ListAsync(HttpContextAccessor.HttpContext.User.Identity.Name);
}

 

Mentre durante lo sviluppo in locale (VS + IISexpress) mi funzionava, una volta pubblicato il progetto su IIS, HttpContextAccessor.HttpContext risultava NULL

Ed infatti googlando il team di sviluppo mette in guardia che “We don't recommend using HttpContextAccessor in server-side Blazor applications as the context is not always available and its availability depends on the underlying transport, which is not reliable.This is the same as for other SignalR applications.”

Il metodo corretto è invece questo (come ben spiegato qui)

[CascadingParameter] Task<AuthenticationState> AuthenticationStateTask { get; set; }
protected override async Task OnInitializedAsync()
{
           var authstate = await AuthenticationStateTask;
           var user = authstate.User;
           Tours = await TourService.ListAsync(user.Identity.Name);
}

Aggiungi Commento

Copyright © 1997-2020 Sandro Rizzetto | All Rights Reserved | Riproduzione delle fotografie vietata | Powered by me