2011-12-20 32 views
8

Tôi đã đọc điều đó để sử dụng thuộc tính [Authorize] trên MVC, bạn chỉ cần đặt nó trên một hành động hoặc trên lớp bộ điều khiển mà bạn muốn bảo mật.Cách sử dụng thuộc tính ủy quyền trên MVC3

Câu hỏi của tôi là: Thuộc tính Authorize biết liệu người dùng có đăng nhập hay không? Tôi có phải cung cấp bất kỳ đối tượng Phiên nào để cho phép Authorize biết liệu người dùng có được ủy quyền không?

Trả lời

15

Thuộc tính này hoạt động bằng cách xem HttpContext.User.Identity.IsAuthenticated.

Nếu bạn đang sử dụng một cái gì đó như FormsAuthentication, điều này sẽ được đặt thành true nếu người dùng có cookie FormsAuthentication hợp lệ trên máy của họ (bạn có thể thêm bằng cách sử dụng FormsAuthentication.SetAuthCookie).

Nếu bạn quan tâm đến các hoạt động bên trong của Authorize, đây là từ mã nguồn của Microsoft xuất bản:

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

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

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 

Đây là some more info on FormsAuthentication.

+0

Cảm ơn rất nhiều. Tài nguyên tuyệt vời! – Jose3d

2

Ủy quyền lớp thuộc tính theo mặc định lấy httpcontext làm đối số. khi được gọi. Sau đó nó kiểm tra giá trị bool HttpContext.User.Identity.IsAuthenticated bool và hành động tương ứng. Điều này chỉ hoạt động nếu bạn sử dụng Xác thực mẫu. Nếu bạn đang sử dụng logic đăng nhập của riêng bạn (ví dụ trong đối tượng phiên), bạn có thể lấy được một lớp từ Authorize Attribute và gọi nó.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,  AllowMultiple = true)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     clsSession sess = httpContext.Session["Current"] as clsSession; 
     if (sess.IsLogin) return true; 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult { ViewName = "Unauthorized" }; 
    } 
} 

Sau đó, bạn có thể sử dụng lớp này như thế này:

[MyAuthorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

này sẽ làm việc. Bạn có thể sử dụng [MyAuthorize] thay vì [Authorize] trong tất cả các thao tác điều khiển. Nếu nó trả về false, nó sẽ trả về một view (trong trường hợp này là "Unauthorized"). Tên chế độ xem có thể là bất kỳ thứ gì và có thể được đặt trong thư mục lượt xem/chia sẻ.

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