2017-01-26 31 views
5

ASP.NET Core web uygulamasındaki bir denetleyicide, kullanıcı ve istemcide depolanan tanımlama bilgisinde hak taleplerini yenilemek istiyorum.Kullanıcı tanımlama bilgisini yenileyin ASP.Net Core Identity

İstemci kimliği doğrulanmış ve yetkilendirilmiş, ASP.NET Çekirdek Kimliği bu Bilgiyi tanımlama bilgisinde saklar - şimdi bazı Denetleyici eylemlerinde çerezi içindeki verileri yenilemek istiyorum.

SignInManager, RefreshSignInAsync'u yenilemek için bir işleve sahiptir, ancak parametre olarak HttpContext.User kabul etmez.

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

Tanımlama bilgilerini nasıl yenileyebilirim?

+0

Eh controller içerisinde bu gibi kullanmak 'HttpContext.User' bir ana içerir (ClaimsPrincipal' ile kimlik ve iddialar). SignInManager Kimlik yapılandırmak için kullandığınız kullanıcı türüne bağlı olan 'TUser' değerini alır. Sadece kullanıcı kimliğini kullanıcıdan al ve yenileyin. eylem filtresi veya uzantı yöntemi olarak ya da her ikisi de – Tseng

cevap

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); 
     } 
    } 
} 

Sonra Sonra bir eylem filtresi

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

     await next(); 
    } 
} 

da denetleyici

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

Yoksa soyut kullanmak

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

Nice olarak soyutlanabilir - bir şey, userManager.GetUserAsync, IdentityUser türünü döndürmez, bunun yerine RefreshSignInAsync parametresiyle birlikte kullanılamayan bir IdentityRoleEntity döndürür. – Sam

+0

'IdentityRoleEntity' nereden geliyor? Kimlik'in bir parçası gibi görünmüyor. Sınıfınız “Kimlik” ten türetilmiş mi? UserManager'ın Identity'den olduğunu ve bunun üzerine jenerik parametrenin kullanıcı modelini, yani varsayılan yapılandırmada 'UserManager ' veya 'UserManager ' veya kendi alanlarınızı genişlettikten sonra sınıfınızı ne adlandırdıysanız sorduğunu sorarım. . – Tseng

+0

Ah, evet - Örnek kodunuzu kullanıyorum 'var userManager = context.RequestServices .GetRequiredService >();' IdentityUser değiştirmeden kendi varlık türüyle. Kullanmam gerekiyordu var userManager = context.RequestServices .GetRequiredService >(); 'yerine. – Sam