2008-08-29 25 views
6

Tôi đang viết một ứng dụng bằng cách sử dụng asp.net-mvc triển khai lên iis6. Tôi đang sử dụng xác thực biểu mẫu. Thông thường khi người dùng cố gắng truy cập tài nguyên mà không có sự cho phép thích hợp, tôi muốn họ được chuyển hướng đến trang đăng nhập. FormsAuth thực hiện điều này cho tôi đủ dễ dàng.Bỏ qua các hình thức Xác thực tự động chuyển hướng để đăng nhập, Làm thế nào để?

Vấn đề: Bây giờ tôi có một ứng dụng được truy cập bởi ứng dụng bảng điều khiển. Cách nhanh nhất để thực hiện hành động này phản hồi w/trạng thái 401 thay vì chuyển hướng yêu cầu đến trang đăng nhập là gì?

Tôi muốn ứng dụng bảng điều khiển có thể phản ứng với Mã trạng thái 401 này thay vì trong suốt. Tôi cũng muốn giữ mặc định, chuyển hướng các yêu cầu trái phép đến hành vi của trang đăng nhập.

Lưu ý: Là một thử nghiệm tôi đã thêm này để global.asax của tôi và nó không hình thức bypass auth:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.SkipAuthorization = true; 
} 

@Dale và Andy

Tôi đang sử dụng AuthorizeAttributeFilter cung cấp trong bản xem trước MVC 4. Đây là trả về một HttpUnauthorizedResult. Kết quả này được thiết lập chính xác statusCode thành 401. Vấn đề, như tôi hiểu, là asp.net đang chặn phản hồi (kể từ khi được gắn thẻ là 401) và chuyển hướng đến trang đăng nhập thay vì chỉ cho phép nó đi qua. Tôi muốn bỏ qua sự ngăn chặn này đối với một số url nhất định.

+1

Xem http://stackoverflow.com/questions/2839406/forms-authentication-disable-redirect-to-the-login-page –

Trả lời

5

Ok, tôi đã giải quyết vấn đề này. Tôi đã tạo một ActionResult tùy chỉnh (HttpForbiddenResult) và ActionFilter tùy chỉnh (NoFallBackAuthorize).

Để tránh chuyển hướng, HttpForbiddenResult đánh dấu phản hồi bằng mã trạng thái 403. FormsAuthentication không nhận được phản hồi với mã này để chuyển hướng đăng nhập bị bỏ qua hiệu quả. Bộ lọc NoFallBackAuthorize kiểm tra xem liệu người dùng có được ủy quyền giống như bộ lọc Authorize được bao gồm hay không. Nó khác ở chỗ nó trả về HttpForbiddenResult khi truy cập bị từ chối.

Các HttpForbiddenResult là khá tầm thường:

 
public class HttpForbiddenResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     context.HttpContext.Response.StatusCode = 0x193; // 403 
    } 
} 

Nó không xuất hiện để có thể bỏ qua chuyển hướng trang đăng nhập trong FormsAuthenticationModule.

+0

Tôi cũng làm như vậy. Anh chàng này nghĩ rằng đó là điều phải làm anyway: http://danielirvine.com/blog/2011/07/18/understanding-403-forbidden –

-1

tôi đã làm một số googling và đây là những gì tôi đã đưa ra:


    HttpContext.Current.Response.StatusCode = 401; 

Không chắc chắn nếu nó hoạt động hay không, tôi đã không kiểm tra nó. Dù bằng cách nào, nó có giá trị một thử, phải không? :)

0

Bạn đã viết thuộc tính FormsAuth của riêng mình cho hành động chưa? Nếu vậy, trong phương thức OnActionExecuting, bạn nhận được thông qua FilterExecutingContext. Bạn có thể sử dụng quyền này để trả lại mã 401.

public class FormsAuth : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(FilterExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.StatusCode = 401; 
     filterContext.Cancel = true; 
    } 
} 

Điều này sẽ hiệu quả. Tôi không chắc chắn nếu bạn đã viết thuộc tính FormsAuth hoặc nếu bạn nhận được nó từ một nơi khác.

0

Tôi chưa sử dụng thuộc tính AuthorizeAttribute có trong Bản xem trước 4. Tôi đã tự mình cuộn, vì tôi đã sử dụng khung MVC từ CTP đầu tiên. Tôi đã xem xét nhanh thuộc tính trong phản xạ và nó đang làm những gì tôi đã đề cập ở trên, ngoại trừ chúng sử dụng hex tương đương 401. Tôi sẽ cần phải xem xét thêm cuộc gọi, để xem nơi ngoại lệ bị bắt, bởi vì nhiều hơn có khả năng đó là nơi họ đang thực hiện chuyển hướng. Đây là chức năng bạn sẽ cần ghi đè. Tôi không chắc chắn nếu bạn có thể làm điều đó được nêu ra, nhưng tôi sẽ đăng lại khi tôi tìm thấy nó và cung cấp cho bạn một công việc xung quanh, trừ khi Haacked thấy điều này và gửi nó cho mình.

1

Có thể là một kludge (và thậm chí có thể không hoạt động) nhưng trên trang Đăng nhập của bạn xem nếu Request.QueryString["ReturnUrl"] != null và nếu có đặt Response.StatusCode = 401.

Lưu ý rằng bạn vẫn sẽ cần phải tải ứng dụng bảng điều khiển của mình để xác thực bằng cách nào đó. Bạn không nhận được auth cơ bản HTTP miễn phí: bạn phải cuộn của riêng bạn, nhưng có rất nhiều triển khai về.

+0

Điều này không giúp cho những lý do vạch ra bởi TheDeeno. –

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