2012-07-20 36 views
7

Tôi có ứng dụng ASP.NET MVC3 với Xác thực Windows được triển khai cho IIS6. Khi người dùng được xác thực nhấp vào liên kết mà họ không được phép xem, họ được nhắc nhập tên người dùng và mật khẩu của họ (trong hộp thoại trình duyệt, không phải trang), như mong đợi.Lấy trang trống thay vì trang lỗi 401

Tuy nhiên, sau khi nhấp vào Hủy hoặc nhập thông tin đăng nhập không hợp lệ ba lần, thay vì nhìn thấy trang 401 trái phép, tôi thấy một trang trắng trống.

Nhìn vào Fiddler, có ba yêu cầu/phản hồi sau khi nhấp vào Hủy. Dưới đây là những tóm tắt phản ứng và tiêu đề:

  1. nhắn ASP.NET Truy cập bị từ chối (401,2)

    HTTP/1.1 401 Unauthorized ngày: Thứ Sáu, 20 Tháng 7 2012 14:34:21 GMT máy chủ : Microsoft-IIS/6.0 WWW-Authenticate: Negotiate WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-ASPNET-Version: 4.0.30319 cache-Control: private Content-type: text/html; charset = utf-8 Content-Length: 1701 Proxy-Hỗ trợ: Dựa trên Phiên-Xác thực

  2. IIS Bạn không được phép xem trang này (401,1)

    HTTP/1.1 401 Unauthorized trang nội dung Thời lượng: 1539 Content-type: text/html server: Microsoft-IIS/6.0 WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ... (bỏ qua cho ngắn gọn) X-Powered-By: ASP.NET ngày: Thứ Sáu, 20 Tháng 7 năm 2012 14:34:21 GMT Hỗ trợ proxy: Dựa trên phiên xác thực

  3. phản ứng Rỗng

    HTTP/1.1 401 Unauthorized ngày: Thứ Sáu, 20 Tháng Bảy 2012 14:34:21 GMT Server: Microsoft-IIS/6.0 WWW-Authenticate: Negotiate WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-AspNet-Phiên bản: 4.0.30319 X-AspNetMvc-Phiên bản: 3.0 Bộ nhớ cache-Điều khiển: riêng Nội dung dài: 0 Hỗ trợ proxy: Phiên dựa trên xác thực

Làm cách nào để hiển thị trang này hiển thị trang lỗi 401?

Cập nhật 1:

Dưới đây là phần lỗi web.config của tôi.

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" /> 

Tôi cũng đang sử dụng HandleErrorAttribute.

Tôi nghi ngờ rằng IIS sẽ trả lại trang trống thay vì ASP.NET, nhưng tôi không chắc chắn cách chứng minh điều đó.

Cập nhật 2:

Điều này thật thú vị.Nếu tôi làm mới trang trống, tôi thấy thông báo ASP.NET Access bị từ chối.

+0

Chỉ cần đoán nhưng có phải cố gắng chuyển hướng chúng trở lại trang Tên người dùng và Mật khẩu do chúng vẫn không được ủy quyền không? Và vì nó đã nghĩ rằng nó xử lý người dùng xem không có gì để hiển thị? –

+0

Đây không phải là trang đăng nhập, hộp thoại đăng nhập trình duyệt của nó. – jrummell

+0

Ah xin lỗi đã không nhìn thấy phần đó. Sau lần thử thứ ba bạn chuyển hướng chúng đến trang 401? Nếu không thì bạn vẫn ở trên cùng một trang nhưng bạn không nhận được bất kỳ nội dung nào được hiển thị vì máy chủ không gửi bất kỳ nội dung nào. –

Trả lời

1

Tôi đã đưa ra công việc này xung quanh sau khi xem xét chuyển hướng 401 như @AndrewHagner đề xuất. Nó dựa trên this answer. Tôi đã triển khai AuthorizeAttribute và bỏ qua HandleUnauthorizedRequest().

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     var authenticatedUnauthorizedRouteValues = 
       new RouteValueDictionary(new {controller = "Error", action = "Index"}); 

     filterContext.Result = new RedirectToRouteResult(authenticatedUnauthorizedRouteValues); 
     filterContext.Controller.TempData["message"] = 
       "You are not authorized to view this page."; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

Vì vậy, tôi hiểu, điều này sẽ bắt các yêu cầu trái phép trong đường ống MVC trước khi được gửi đến IIS. Điều này mang lại cho tôi cơ hội để chuyển hướng đến một trang thân thiện với người dùng không được ủy quyền.

+0

Tôi vẫn muốn biết lý do tại sao tôi đã nhận được một trang trống mà không có điều này mặc dù. – jrummell

+2

Chỉ cần cho bạn biết dòng 3 'if (filterContext.HttpContext.User.Identity.IsAuthenticated)' cần phải là 'if (! FilterContext.HttpContext.User.Identity.IsAuthenticated)' – Azerothian

+0

Tốt bắt! Tôi đã cập nhật mã. – jrummell

0

bạn nên thử đặt trong số web.config gửi quy tắc để chuyển hướng người dùng đến trang Không được ủy quyền theo cách này.

<System.Web> 
    //map all the erros presented in the application to the error.aspx webpage 
    <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx"> 
    //redirect the user to a Error401.pasx Page after the server get an 401 Error 
    <error statusCode="401" redirect="Error401.aspx" /> 
    </customErrors> 
<System.Web> 

Tôi hy vọng điều này phù hợp với bạn.

+0

Điều đó không tạo nên sự khác biệt. (và '' phải là con của '') – jrummell

+0

quyền @jrummell của bạn, cảm ơn! –

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