2015-03-03 24 views
5

Tôi đang sử dụng danh tính ASP.NET với số ClaimsIdentity để xác thực người dùng của mình. Khi người dùng được xác thực, thuộc tính User.Identity chứa một phiên bản ClaimsIdentity.ASP.NET Identity không được đặt trong yêu cầu đăng nhập

Tuy nhiên, đây không phải là trường hợp trong thời gian yêu cầu đăng nhập:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, false, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       var identity = User.Identity; 

------------> // identity is of type WindowsIdentity <------------ 

       return RedirectToLocal(returnUrl); 

Như bạn có thể thấy, mặc dù đăng nhập thành công, tài sản User.Identity chưa được thiết lập để ClaimsIdentity dụ. Tôi nghĩ điều này là hợp lý, có nghĩa là SignInManager không cập nhật thuộc tính, vì vậy chúng tôi phải đợi cho đến khi yêu cầu tiếp theo để xem kết quả của thông tin đăng nhập.

Tuy nhiên, tôi phải làm luận bổ sung sau khi các phương pháp PasswordSignInAsync, vì vậy tôi cần một cách để có được những ví dụ ClaimsIdentity trong .success chi nhánh của câu lệnh switch.

Trong khi kiểm tra việc SignInManager trong trình gỡ lỗi, tôi thấy rằng nó là loại Microsoft.Owin.Security.AuthenticationManager, trong đó có tài sản SignInEntry.Item1 chứa ClaimsIdentity tôi đang tìm kiếm.

Tuy nhiên, loại Microsoft.Owin.Security.AuthenticationManager không được công khai, do đó, cách duy nhất có vẻ là hack bằng cách sử dụng phản chiếu.

Có cách nào tốt hơn không?

+1

Sử dụng 'RedirectToAction' và nhận dạng danh tính trong hành động đó? Thay vì trả lại URL, hãy trả về tên của chế độ xem bạn muốn chuyển hướng đến. –

+0

Đó là cách giải quyết mà tôi đang sử dụng tại thời điểm này. Nhưng không phải là có thể nhận được 'ClaimsIdentity' trong hành động Đăng nhập? – cheeesus

+1

[Dường như không.] (Http://stackoverflow.com/a/26739821/3846058) –

Trả lời

6

Tôi đồng ý rằng quá xấu khi PasswordSignInAsync không trả về cá thể người dùng dưới dạng tham số ngoài. Nếu bạn nhìn mã nguồn, bạn có thể thấy mã nguồn sử dụng this.UserManager.FindByNameAsync(userName) để tìm người dùng theo userName và sau đó sử dụng this.UserManager.CheckPasswordAsync(user, password) để xác thực mật khẩu, nhưng người dùng được lưu trữ trong biến cục bộ.

Tôi nghĩ rằng điều này nên được đề xuất như là một cải tiến cho lớp SignInManager.

Một có thể (và không hiệu quả) Cách giải quyết là để truy vấn cho người sử dụng một lần nữa và sau đó tạo ra các yourselft tuyên bố danh tính trong cùng một cách SignInManager.SignInAsync làm:

 ApplicationUser user = await UserManager.FindByNameAsync(model.Email); 
     ClaimsIdentity claimsIdentity = await SignInManager.CreateUserIdentityAsync(user); 
2

Danh tính được tiếp xúc qua AuthenticationResponseGrant bất động sản:

ClaimsIdentity identity = SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity; 
Các vấn đề liên quan