Tak. Chcesz powiedzieć, że lepiej jest odpytać bazę danych o potrzebne informacje niż zwyczajnie zdeserializować jsona do obiektu?
Przede wszystkim chodzi o to żeby zawierać w tokenie niezbędne minimum. Koniec końców jest to coś co stale przesyłamy w requestach. Ponadto warto się zastanowić czy faktycznie potrzebujesz całego użytkownika, ze wszystkimi właściwościami? Bardzo często tak nie jest, i potrzebujemy jedynie mały podzbiór informacji. A jeśli potrzebujesz całego użytkownika to tak- ja bym go wyciągał z bazy danych, a w tokenie przesyłał jego ID.
Co to są informacje o użytkowniku? Czy email, nazwa bazy, nazwa firmy to już użytkownik czy informacje o nim?
Chodziło mi właśnie o to że każdy taki rodzaj informacji (np. adres email, imię, nazwa firmy) to powinien być oddzielny claim.
Rzucisz jakim przykładem gdzie ten middleware miałby użycie? Myślałem właśnie o jakiś serwisie pośredniczącym, który by taką walidację przeprowadzał i zwracał odpowiednie informacje. Tylko jak to zrobić w konstruktorze, skoro token i informacje o użytkowniku wpadają dopiero na endpoint'cie?
Trochę poleciałem z tym middleware bo zakładając że używasz standardową autoryzację Identity to nawet middleware nie jest potrzebne. W jednym z projektów ja użyłem czegoś takiego:
public interface IClaimsPrincipalAccessor
{
ClaimsPrincipal Principal { get; }
}
internal class ClaimsPrincipalAccessor : IClaimsPrincipalAccessor
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ClaimsPrincipalAccessor(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public ClaimsPrincipal Principal => _httpContextAccessor.HttpContext.User;
}
```
Oczywiście to nadal jest dosyć techniczne bo konsument tego serwisu będzie musiał operować bezpośrednio na claimach, więc zależnie od tego jak wydzieloną masz warstwę biznesową/domenową możesz chcieć wyabstrahować to jeszcze bardziej i wystawić właściwości bezpośrednio z informacjami o obecnym użytkowniku, np.
``````csharp
public interface ICurrentUser
{
string Email { get; }
string CompanyName { get; }
}
```