2017-01-26 10 views
5

W kontrolerze w aplikacji sieci Web ASP.NET Core chcę odświeżyć użytkownika i roszczenia w pliku cookie przechowywanym na kliencie.Odświeżenie biletu cookie użytkownika w ASP.Net Core Identity

Klient jest uwierzytelniony i autoryzowany, ASP.NET Core Identity przechowuje te informacje w bilecie cookie - teraz w niektórych kontrolerach chcę odświeżyć dane w pliku cookie.

Funkcjama funkcję odświeżania RefreshSignInAsync, ale jako parametr nie przyjmuje wartości HttpContext.User.

[HttpPost("[action]")] 
[Authorize] 
public async Task<IActionResult> Validate() 
{ 
    // todo: update the Client Cookie 
    await _signInManager.RefreshSignInAsync(User); // wrong type 
} 

Jak odświeżyć plik cookie?

+0

Cóż, 'HttpContext.User' zawiera nazwę użytkownika (' ClaimsPrincipal', with tożsamość i roszczenia). SignInManager Wykonuje 'TUser', który zależy od typu użytkownika użytego do skonfigurowania Tożsamości. Wystarczy uzyskać identyfikator użytkownika z tokena, aby uzyskać użytkownika i odświeżyć go. może zostać wyodrębniony jako filtr akcji lub metoda rozszerzenia lub oba. – Tseng

Odpowiedz

7
public static class HttpContextExtenssions 
{ 
    public static async Task RefreshLoginAsync(this HttpContext context) 
    { 
     if (context.User == null) 
      return; 

     // The example uses base class, IdentityUser, yours may be called 
     // ApplicationUser if you have added any extra fields to the model 
     var userManager = context.RequestServices 
      .GetRequiredService<UserManager<IdentityUser>>(); 
     var signInManager = context.RequestServices 
      .GetRequiredService<SignInManager<IdentityUser>>(); 

     IdentityUser user = await userManager.GetUserAsync(context.User); 

     if(signInManager.IsSignedIn(context.User)) 
     { 
      await signInManager.RefreshSignInAsync(user); 
     } 
    } 
} 

następnie używać go w kontrolerze

[HttpPost("[action]")] 
[Authorize] 
public async Task<IActionResult> Validate() 
{ 
    await HttpContext.RefreshLoginAsync(); 
} 

lub abstrakcyjne to w filtrze działania

public class RefreshLoginAttribute : ActionFilterAttribute 
{ 
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     await context.HttpContext.RefreshLoginAsync(); 

     await next(); 
    } 
} 

następnie używać go tak jak to w kontrolerze

[HttpPost("[action]")] 
[Authorize] 
[RefreshLogin] // or simpler [Authorize, RefreshLogin] 
public async Task<IActionResult> Validate() 
{ 
    // your normal controller code 
} 
+0

Nice - jedna rzecz, userManager.GetUserAsync nie zwraca zamiast tego tożsamości IdentityUser, ale tożsamości IdentityRoleEntity, której nie można używać z parametrem RefreshSignInAsync. – Sam

+0

Skąd pochodzi nazwa "IdentityRoleEntity"? Nie wydaje się być częścią Tożsamości. Czy twoja klasa pochodzi od "Tożsamości"? Pytam, ponieważ UserManager pochodzi z Identity, a parametr generyczny na nim to model użytkownika, tj. 'UserManager ' w domyślnej konfiguracji lub 'UserManager ' lub cokolwiek nazwała twoja klasa, kiedy rozszerzyłeś do niej swoje własne pola . – Tseng

+0

Ach, tak - użyłem twojego przykładu Kod 'var userManager = context.RequestServices .GetRequiredService >();' bez zamiany 'IdentityUser' na mój własny typ jednostki. Potrzebowałem użyć 'var userManager = context.RequestServices .GetRequiredService >();' zamiast tego. – Sam

Powiązane problemy