2011-09-16 29 views
18

Tôi đang sử dụng MVC 3 với Xác thực biểu mẫu. Trên bộ điều khiển hoặc phương pháp của tôi, tôi đang thực hiện như sau:ASP.NET - Chuyển hướng đến trang lỗi nếu ủy quyền vai trò không hợp lệ

[Authorize (Roles = "developer")] 

Trong trường hợp này, tôi muốn kiểm tra xem người dùng có đăng nhập hay không, gửi lại trang đăng nhập. Tuy nhiên, nếu kiểm tra 'IsInRole' cho người dùng đó trả về false, tôi muốn họ đi đến một chế độ xem khác có nội dung 'Không được ủy quyền'.

Cách tốt nhất để thực hiện điều gì đó như thế này là gì? Tôi đã hy vọng tránh tạo ra một thuộc tính Authorization mới vì vậy tôi không phải refactor mỗi thuộc tính Authorize trong toàn bộ ứng dụng của tôi, nhưng nếu đó là những gì được yêu cầu, tôi sẽ đi theo lộ trình đó.

Trả lời

44

Một thuộc tính tùy chỉnh ủy quyền trọng phương pháp HandleUnauthorizedRequest có thể thực hiện công việc:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole)) 
     { 
      // The user is not in any of the listed roles => 
      // show the unauthorized view 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml" 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

và sau đó:

[MyAuthorize(Roles = "developer")] 
public ActionResult Develop() 
{ 
    ... 
} 
+0

Điều này làm việc hoàn hảo. – Brandon

+0

Hoàn hảo ... nhờ ... – Shaz

+3

Bạn đặt triển khai tùy chỉnh này ở đâu? –

1

Bạn cũng có thể làm điều này với trang lỗi tùy chỉnh cho 401 mã trạng thái.

Xem this question để biết chi tiết triển khai.

0

Bạn có thể sử dụng nó như thế này.Bởi vì nếu bạn không có quyền, phương thức này sẽ đến. Kiểm soát ủy quyền là không cần thiết

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // The user is not authenticated 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "~/Views/Shared/Unauthorized.cshtml", 
      }; 
     } 
    } 
Các vấn đề liên quan