2011-12-28 26 views
21

Mã này là từ MVC mã nguồn RTM asp.netAi bộ tài sản của HttpContext.User.Identity

Ai bộ tài sản của HttpContext.User.Identity IsAuthenticated IsAuthenticated?

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 
    } 

là tài sản IsAuthenticated thiết lập bằng cách gọi phương pháp này (asp.net MVC dự án 4,0 mẫu):

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

Khi tôi gỡ lỗi mã của Logon phương pháp của MVC asp.net 4.0 dự án mẫu sau cuộc gọi phương thức FormsAuth ... ở trên. Việc thực hiện

User.Identity.IsAuthenticated 

vẫn đang trả về FALSE. Chỉ khi tôi gỡ lỗi các phương pháp Logoff các

User.Identity.IsAuthenticated 

nói TRUE. Vậy ai là người thiết lập thuộc tính này thành TRUE và WHEN?

CẬP NHẬT:

Đây là khoảng HÌNH THỨC xác thực!

Tôi hiện đã gỡ lỗi phương thức LogOn của dự án mẫu asp.net mvc và sau khi hành động LogOn được trả về, phương thức AuthorizeCore tôi đã ghi đè được gọi và sau đó thuộc tính IsAuthenticated là TRUE!

Cài đặt TRUE có phụ thuộc vào bộ sưu tập ModelState.Value.Error không?

Nếu count == 0 trong các bộ sưu tập lỗi các IsAuthenticated là TRUE khác các IsAuthenticated là FALSE

Bạn có thể xác nhận rằng?

Trả lời

22

Thuộc tính này được đặt bởi mô-đun xác thực biểu mẫu bằng cách đọc và phân tích cookie xác thực biểu mẫu từ số yêu cầu. Tôi đã đưa ra yêu cầu in đậm vì tôi nghi ngờ đó là lý do tại sao bạn quan sát hành vi này. Hãy để tôi giải thích. Khi bạn gọi FormsAuthentication.SetAuthCookie sau khi xác thực thành công, bạn sẽ thêm cookie xác thực vào phản hồi . Cookie này sẽ được lưu trữ trên trình duyệt của khách hàng và sẽ được gửi theo số các yêu cầu tiếp theo. Vì vậy, nó chỉ là trên các yêu cầu tiếp theo mà người dùng sẽ được coi là xác thực. Vì vậy, bạn cần luôn chuyển hướng sau khi gọi phương thức SetAuthCookie. Bên trong yêu cầu gọi là phương thức này bạn đã biết liệu người dùng đã cung cấp thông tin đăng nhập chính xác chưa, do đó bạn không cần phải kiểm tra thuộc tính IsAuthenticated.

+0

Không có liên kết nguồn nhưng đánh giá các giải pháp asp.net MVC khác của bạn Tôi thấy bạn là chuyên gia ;-) Tôi thích trên lời giải thích với các yêu cầu tiếp theo mà nhiều người không hiểu/tìm googling để được giúp đỡ trong cùng một chủ đề này. – Elisabeth

+0

@DarinDimitrov Nếu phản hồi được viết đúng cookie bao gồm vé FormAuthentication sau khi được xác thực thành công. Asp.net sẽ đọc và giải quyết nó từ yêu cầu. nó sẽ xác định nếu 'IsAuthenticated' đúng là false. Bất kỳ vấn đề xin vui lòng sửa tôi. Cảm ơn. –

1

Nguồn gốc của thuộc tính tùy thuộc vào loại Identity. Đối với một FormsIdentity, khách sạn sẽ chỉ trả về true:

/// <devdoc> 
/// Indicates whether or not authentication took 
/// place. 
/// </devdoc> 
public bool       IsAuthenticated { get { return true;}} 

Điều đó làm cho ý nghĩa bởi vì các mã trong FormsAuthenticationModule.cs chỉ assignes một FormsIdentity sau khi xác thực. Mã có vẻ khá phức tạp, tôi thấy nó trích xuất một vé từ một cookie, nhưng tôi không thể tìm thấy nơi nó xác nhận vé.

+0

xin lỗi Andomar Tôi không viết tất cả về xác thực Biểu mẫu. Tôi đã chỉnh sửa câu hỏi của mình. – Elisabeth

+0

Những gì tôi đã đọc cho đến nay trong google và sau khi một số thử nghiệm FormsAuthentication.SetAuthCookie cần phải được thiết lập IsAuthenticated trả về true. với var isAuthenticated = base.AuthorizeCore (httpContext); trong phương thức AuthorizeCore bị lược bỏ của tôi. Trên thực tế nó nên được gọi là AuthenticateCore nhưng đó là một câu chuyện khác. Tôi sẽ hài lòng và đánh dấu nó là giải pháp nếu bất cứ ai có một liên kết/bằng chứng Microsoft bất cứ điều gì làm cho chuyển đổi nhảy IsAuthenticated thành sự thật! – Elisabeth

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