2011-08-21 11 views
13

Điều này nên được đơn giản, nhưng tôi chỉ đơn giản là không thể tìm ra sau khi tất cả googling của tôi. Đây là những gì tôi muốn. Tôi có một bảng người dùng tùy chỉnh (không có vai trò tại thời điểm này) mà tôi muốn cho phép chống lại. Đối với điều này tôi sẽ phải thực hiện một nhà cung cấp thành viên tùy chỉnh mà tôi đã làm. Câu hỏi của tôi là mặc dù, làm thế nào để tôi đi về thiết lập một IPrincipal tùy chỉnh cho HttpContext.Current.User? Điều đó sẽ xảy ra ở đâu? Hãy nói rằng tôi có các thiết lập sau:Tùy chỉnh IPrincipal với các hình thức xác thực trong ASP.NET MVC

public class CustomMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repository; 

    public CustomMembershipProvider(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     //check user repository 
    } 

    //additional methods omitted for brevity 
} 

sau đó tôi có một lớp người dùng tùy chỉnh các dụng cụ IPrincipalIIdentity

public class CustomUser : IPrincipal 
    { 
     public CustomUser(string name, int userId, string additionalInfo) 
     { 
      Identity = new CustomIdentity(name, userId, additionalInfo); 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) 
     { 
      return true; 
     } 
    } 

    public class CustomIdentity : IIdentity 
    { 
     public CustomIdentity(string name, int userId, string additionalInfo) 
     { 
      Name = name; 
      UserId = userId; 
      AdditionalInfo = additionalInfo; 
     } 

     public string Name { get; private set; } 

     public string AuthenticationType 
     { 
      get { return "CustomAuth"; } 
     } 

     public bool IsAuthenticated 
     { 
      get { return !String.IsNullOrEmpty(Name); } 
     } 

     public int UserId { get; private set; } 
     public string AdditionalInfo { get; private set; } 
    } 

Vì vậy, câu hỏi của tôi là, đâu là địa điểm chính xác để thiết lập Context.User cho một phiên bản của người dùng tùy chỉnh này? Tôi có cần Thuộc tính ủy quyền tùy chỉnh không? Nếu vậy, nó sẽ như thế nào?

+0

Làm thế nào bạn tiếp tục với điều này cuối cùng? Tôi đang trong những ngày đầu làm một cái gì đó tương tự như bản thân mình. – ETFairfax

+0

Tôi đang trên cùng một chiếc thuyền, tôi gần như đã sẵn sàng để tạo ra một phương pháp mở rộng để thực hiện công việc! –

Trả lời

2

tôi đề nghị sử dụng một lớp cơ sở điều khiển tùy chỉnh cho tất cả các bộ điều khiển của bạn

Sau đó, trong OnAuthorization, gọi

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    // Actual Authentication 
    HttpContext.User = user; 
    Thread.CurrentPrincipal = user; 
    base.OnAuthorization(filterContext); 
} 

Tôi không hoàn toàn chắc chắn làm thế nào để gọi các nhà cung cấp thành viên vì tôi đang làm nó manuallt, nhưng tôi nghĩ rằng bạn có quyền truy cập tĩnh để Membership.Provider để thực hiện việc xây dựng đối tượng thực tế.

Tôi có cần Thuộc tính ủy quyền tùy chỉnh không?

No. Thông báo sự khác biệt của xác thực và ủy quyền: xác thực danh tính của người dùng trong hệ thống của bạn. Ủy quyền cho phép hoặc từ chối một yêu cầu cụ thể. Do đó, AuthorizeAttribute cũng có thông số Roles để cho phép một hành động chỉ được gọi bởi một số người dùng nhất định.

+0

Tôi không chắc tôi hiểu câu trả lời của bạn. Khi bạn nói xác thực thực tế, bạn đang nói về thực sự thiết lập AuthCookie ở đó? Sau đó, bản thân Loing sẽ làm gì trên bài đăng? – BFree

+0

Cách tôi hiểu MembershipProvider, ValidateUser không nên được gọi rất thường xuyên - ngay sau khi người dùng đăng nhập, anh ta recvs một cookie xác thực sẽ được sử dụng từ nay trở đi. Tuy nhiên, để có được đối tượng người dùng, bạn sẽ phải nhấn vào cơ sở dữ liệu (hoặc một số cache). Nhưng đó là yêu cầu của mã của bạn. Tôi nghĩ rằng MembershipProvider không được thiết kế rất tốt, làm theo cách thủ công có rất nhiều lợi ích. – mnemosyn

+0

Bây giờ bạn đã thay đổi nhận xét của mình trong khi tôi đang viết bài viết của tôi :) 'OnAuthorization' sẽ được gọi cho mọi yêu cầu, ngay cả khi người dùng đã được xác thực (forms-); Bạn đang nhấn DB chỉ để tìm nạp đối tượng người dùng. – mnemosyn