2010-06-07 31 views
8

Tôi đang gặp khó khăn khi thực hiện chức năng "Nhớ tôi" trong ứng dụng MVC với hiệu trưởng tùy chỉnh. Tôi đã đun sôi nó xuống để ASP.NET không lấy cookie xác thực cho tôi. Tôi đã bao gồm ảnh chụp nhanh bên dưới từ Google Chrome.Cookie xác thực MVC ASP.NET không được truy xuất (CẬP NHẬT)

  1. Hiển thị kết quả của Request.Cookies được đặt trong hành động điều khiển và được đặt trong Chế độ xem cho chế độ xem để đọc. Lưu ý rằng nó thiếu cookie .ASPXAUTH

  2. Hiển thị kết quả từ công cụ nhà phát triển Chrome. Bạn có thể thấy rằng .ASPXAUTH được bao gồm ở đây.

alt text http://i50.tinypic.com/ibctjd.png

Có ai biết những gì vấn đề có thể có mặt ở đây? Tại sao ASP.NET không đọc giá trị này từ bộ sưu tập cookie?

Ứng dụng của tôi sử dụng IPrincipal tùy chỉnh. BusinessPrincipalBase là một đối tượng CSLA mà chúng ta thực hiện IPrincipal. Đây là mã cho rằng:

[Serializable()] 
public class MoralePrincipal : BusinessPrincipalBase 
{ 
    private User _user; 

    public User User 
    { 
     get 
     { 
      return _user; 
     } 
    } 

    private MoralePrincipal(IIdentity identity) : base(identity) 
    { 
     if (identity is User) 
     { 
      _user = (User)identity; 
     } 
    } 

    public override bool Equals(object obj) 
    { 
     MoralePrincipal principal = obj as MoralePrincipal; 
     if (principal != null) 
     { 
      if (principal.Identity is User && this.Identity is User) 
      { 
       return ((User)principal.Identity).Equals(((User)this.Identity)); 
      } 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public static bool Login(string username, string password) 
    { 
     User identity = User.Fetch(username, password); 
     if (identity == null || !identity.IsAuthenticated) 
     { 
      identity = (User)User.UnauthenicatedIdentity; 
     } 

     MoralePrincipal principal = new MoralePrincipal(identity); 
     Csla.ApplicationContext.User = principal; 
     Context.Current.User = identity; 

     return identity != null && identity.IsAuthenticated; 
    } 

    public static void Logout() 
    { 
     IIdentity identity = User.UnauthenicatedIdentity; 
     MoralePrincipal principal = new MoralePrincipal(identity); 
     ApplicationContext.User = principal; 
     Context.Current.User = identity as User; 
    } 

    public override bool IsInRole(string role) 
    { 
     if (Context.Current.User == null || Context.Current.Project == null) 
     { 
      return false; 
     } 

     string userRole = Context.Current.User.GetRole(Context.Current.Project.Id); 
     return string.Compare(role, userRole, true) == 0; 
    } 

Ứng dụng này cũng sử dụng nhà cung cấp tư cách thành viên tùy chỉnh. Đây là mã cho điều đó.

public class MoraleMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     bool result = MoralePrincipal.Login(username, password); 
     HttpContext.Current.Session["CslaPrincipal"] = ApplicationContext.User; 
     return result; 
    } 

    #region Non-Implemented Properties/Methods 

    public override string ApplicationName 
    { 
     get 
     { 
      return "Morale"; 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    // Everything else just throws a NotImplementedException 

    #endregion 
} 

Tôi không nghĩ rằng bất kỳ điều này liên quan vì dòng dưới cùng là Request.Cookies không trả lại cookie xác thực. Nó có liên quan đến kích thước của cookie không? Tôi nghe nói có vấn đề với kích thước của cookie.

CẬP NHẬT: Dường như vấn đề xoay quanh tên miền phụ. Trang web này đã được lưu trữ với tên miền phụ và miền cookie được để trống. Có ai có bất kỳ gợi ý nào về cách tôi có thể nhận cookie xác thực để làm việc với tất cả các miền (ví dụ: http://mydomain.com, http://www.mydomain.comhttp://sub.mydomain.com)?

+0

Bạn có thể đăng mã bạn đang sử dụng trong quá trình đăng nhập của người dùng không? Bạn chỉ sử dụng công cụ được xây dựng trong FormsAuthentication, mà không cần sử dụng nhà cung cấp? Hoặc, bạn có đang sử dụng nhà cung cấp tùy chỉnh của riêng mình không? – sestocker

+0

Trong lần đăng nhập đầu tiên, giá trị nào được liên kết với cookie (đặc biệt là hết hạn)? – sestocker

+0

Đây là những gì cookie trông giống như: http://i50.tinypic.com/npm26c.png –

Trả lời

1

bạn cũng đã kiểm tra điều này?

ASPXAUTH cookie is not being saved

Tôi không chắc chắn nếu điều đó sẽ là nguyên nhân gây ra các cookie hiển thị trong chrome nhưng không thực sự được thông qua để trình duyệt hoặc nếu nó có thể ngăn chặn các cookie từ tiết kiệm nhưng cũng đáng xem.

+0

Tôi đã làm việc để giảm kích thước và tôi vẫn không thể lấy cookie từ bộ sưu tập Request.Cookies trừ khi trong cùng một phiên. Tôi biết rằng đây không phải là cookie phiên và nó được lưu vào đĩa. –

1

Nếu bạn đang cố gắng lưu trữ đối tượng Người dùng thực tế trong chính cookie, nó có thể quá lớn để lưu trữ dưới dạng cookie. Tôi không quá quen thuộc với các công cụ xác thực MVC, nhưng trong hình thức web tôi thường làm như sau:

FormsAuthentication.RedirectFromLoginPage(user_unique_id_here, false); 

Tham số thứ hai là cho persistency bạn đang tìm kiếm.

Từ đó tôi tạo ngữ cảnh tùy chỉnh (UserContext) mà tôi điền thông qua HttpModule cho phép tôi truy cập vào tất cả thông tin người dùng và vai trò.

Vì tôi không phát triển trong MVC (chưa) hoặc CSLA, tôi không chắc chắn tôi có thể giúp được bao nhiêu. Nếu tôi là bạn, tôi cũng sẽ bỏ nhà cung cấp tư cách thành viên tùy chỉnh. Bạn cũng có thể gọi MoralePrincipal.Login trực tiếp trong bộ điều khiển xác thực của bạn.

+0

Vâng, đó là suy nghĩ của tôi sau khi tôi đã đánh máy này. Tôi nghĩ rằng phiên bản serialized của đối tượng User của tôi quá lớn. Tôi có thể phải tạo một đối tượng khác nhau cho IIdentity đó là nhỏ hơn và có thể được an toàn serialized vào đĩa. –

+0

http://stackoverflow.com/questions/2224562/asp-net-formsauthentication-redirect-loses-the-cookie-between-redirect-and-applic –

+0

Tôi đã nghiên cứu sử dụng một đối tượng nhỏ hơn được tuần tự hóa và tôi vẫn nhận được cùng một vấn đề. Tôi bị mắc kẹt một lần nữa. –

1

Công cụ RememberMe phải được đặt bởi FormsAuthenticationService (trong MVC2) hoặc lớp tĩnh FormsAuthentication trong MVC1, nếu bạn đang sử dụng mã 'AccountController' thông thường '. Nếu bạn thay đổi mã đó, bạn có nhớ thêm vào tham số boolean (tùy chọn) cho biết có sử dụng cookie liên tục hay không?

Nghe có vẻ như tôi đang nhận cookie phiên, nhưng không phải là cookie lâu dài.

+0

Cookie có trong cookie của trình duyệt. Tôi đã xác minh điều này bằng cách sử dụng Firebug trong Firefox và Công cụ dành cho nhà phát triển trong Chrome. Vấn đề là .NET không trả lại cookie trong bộ sưu tập. Nó không phải là cookie phiên. –

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