2017-01-26 22 views
5

Trong bộ điều khiển trong ứng dụng web ASP.NET Core, tôi muốn làm mới người dùng và xác nhận quyền sở hữu trong vé cookie được lưu trữ trên máy khách.Làm mới vé cookie của người dùng trong ASP.Net Core Identity

Khách hàng được xác thực và ủy quyền, ASP.NET Core Identity lưu thông tin này trong vé cookie - hiện tại trong một số hành động của Trình điều khiển tôi muốn làm mới dữ liệu trong cookie.

SignInManager có chức năng làm mới RefreshSignInAsync, nhưng không chấp nhận HttpContext.User làm thông số.

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

Làm cách nào để làm mới cookie?

+0

Vâng, 'HttpContext.User' chứa một hiệu trưởng (' ClaimsPrincipal', với danh tính và tuyên bố). SignInManager Lấy 'TUser' phụ thuộc vào kiểu người dùng mà bạn sử dụng để cấu hình Identity. Chỉ cần lấy ID người dùng từ mã thông báo có được người dùng và làm mới nó. có thể được tóm tắt dưới dạng bộ lọc hành động hoặc phương pháp mở rộng hoặc cả hai – Tseng

Trả lời

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

Sau đó, sử dụng nó trong điều khiển của bạn

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

Hoặc trừu tượng nó trong một bộ lọc hành động

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

     await next(); 
    } 
} 

Sau đó, sử dụng nó như thế này trong điều khiển của bạn

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

Tốt - một điều, userManager.GetUserAsync không trả lại loại IdentityUser nhưng thay vào đó một IdentityRoleEntity, không thể sử dụng với tham số RefreshSignInAsync. – Sam

+0

'IdentityRoleEntity' đến từ đâu? Nó không có vẻ là một phần của Identity. Có phải lớp của bạn bắt nguồn từ 'Identity'? Tôi hỏi vì UserManager là từ Identity và tham số chung trên nó là mô hình người dùng, tức là 'UserManager ' trong cấu hình mặc định hoặc 'UserManager ' hoặc bất cứ thứ gì bạn đặt tên cho lớp, khi bạn mở rộng các trường của riêng mình . – Tseng

+0

Ah, vâng - tôi đã sử dụng mã ví dụ của bạn 'var userManager = context.RequestServices .GetRequiredService >();' mà không thay thế 'IdentityUser' bằng loại thực thể của riêng tôi. Tôi cần sử dụng 'var userManager = context.RequestServices .GetRequiredService >();' thay thế. – Sam

Các vấn đề liên quan