2011-04-01 31 views
7

Tôi có một ứng dụng MVC với khối sau bên trong Web.config:C# MVC: Cách ghi đè chuyển hướng xác thực được định cấu hình?

<authentication mode="Forms"> 
    <forms loginUrl="~/Login" timeout="2880" /> 
</authentication> 

Vì vậy, nếu người dùng yêu cầu một trang và ủy quyền thất bại, họ sẽ được chuyển đến ~/Đăng nhập.

Tốt và tôi cần nó cho hầu hết các bộ điều khiển của mình. Tuy nhiên, tôi có một bộ điều khiển mà tôi muốn bỏ qua quy tắc này. Làm thế nào tôi có thể cho phép các bộ điều khiển cụ thể bỏ qua quy tắc này?

Vấn đề của tôi là trong ứng dụng MVC của tôi (có nhiều bộ điều khiển), tôi có một bộ điều khiển nhất định lưu trữ một giao diện REST (không có nghĩa là để sử dụng trình duyệt). Vì bộ điều khiển này không có nghĩa là cho trình duyệt tiêu thụ, tôi không muốn nó gửi lại toàn bộ trang đăng nhập, (hoặc bất kỳ trang nào thực sự, chỉ là chuỗi hoặc một phần lượt xem.)

Lưu ý rằng tôi đang sử dụng tùy chỉnh [Authorize ...] thuộc tính trên hành động của tôi, và khi THESE thất bại, họ chuyển hướng đến một hành động Lỗi - nhưng, không may, hành động Lỗi của tôi (trả về một chuỗi ngắn) đang được chuyển hướng đến trang Đăng nhập vì điều này cài đặt cấu hình!

Tôi thấy chóng mặt khi cố gắng tìm ra điều này, tôi đang làm gì sai? Tôi có thể cung cấp thêm chi tiết nếu cần.

+0

Bạn đang kế thừa từ AuthorizeAttribute hoặc implementating IAuthorizationFilter –

+0

Thừa hưởng từ AuthorizeAttribute. –

Trả lời

11

Bạn có thể mở rộng lớp AuthorizeAttribute và ghi đè HandleUnauthorizedRequest, bạn có thể muốn trả lại mã trạng thái http bị cấm thay vì thông báo tùy chỉnh.

public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // You need to set this action result to something other than a HttpUnauthorizedResult, 
     // this result will cause the redirection to the login page 

     // Forbidden request... does not redirect to login page 
     // filterContext.Result = new HttpStatusCodeResult(403); 

     filterContext.Result = new ErrorActionResult { ErrorMessage = "Unauthorized Access" }; 
    } 
} 

public class ErrorActionResult : ActionResult 
{ 
    public string ErrorMessage { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.Write(this.ErrorMessage); 
    } 
} 
+0

Bạn đã xác định được vấn đề của tôi về: trả lại 401 trái phép đã khiến nó chuyển hướng. Sử dụng Cấm có vẻ như một cách giải quyết tốt, mặc dù thành thật mà nói tôi muốn một người dùng nhìn thấy "Trái phép" hơn "Cấm" trong trường hợp này. Nhưng tôi sẽ chỉ sử dụng cấm. –

2

Thêm những điều sau đây sau khi tố system.web của bạn trong Web.config:

<location path="home"> 
<system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
</system.web> 
</location> 

Điều này sẽ cho phép người dùng không được thẩm định truy cập vào "/ home" và do đó bất cứ hành động trên HomeController.

+0

Tôi không thích ý tưởng đặt này trong Web.config, vì đây là một cái gì đó tôi không muốn để có thể vô tình quên triển khai hoặc vô tình ghi đè lên. Nhưng đó có thể là một cách tiếp cận tốt trong các tình huống khác, cảm ơn bạn. –

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