2015-04-23 16 views
14

Tôi có nên xóa câu hỏi này không? Tôi đã tìm ra vấn đề là gì và không phải là IIS ... Xem câu trả lời của tôi bên dưới để biết kết quả.Chuyển hướng AJAX Weird 401 vấn đề với IIS

Câu hỏi gốc Tôi đang làm việc trên một ứng dụng ASP.Net MVC và chạy vào một vấn đề lạ với URL Rewrite chuyển hướng và yêu cầu AJAX.

Tôi đã thêm quy tắc ghi đè sau vào Web.config của mình trong trang gốc.

<rewrite> 
    <rules> 
     <rule name="Account" stopProcessing="true"> 
      <match url="^SubApp/Account/(.*)$" /> 
      <action type="Redirect" url="Account/{R:1}" redirectType="Found" /> 
     </rule> 
    </rules> 
</rewrite> 

Tất cả mọi thứ dường như làm việc ok nếu tôi sử dụng một Permanent hoặc TemporaryredirectType trong cấu hình nhưng không thành công với một trang lỗi HTTP Error 401.0 - Unauthorized IIS.

Khi tôi thực hiện yêu cầu GET bình thường thông qua trình duyệt cho một hành động sẽ kích hoạt quy tắc này, ví dụ: https://some-site/SubApp/Account/Settings sau đó tôi nhận được 302 Tìm thấy và tiêu đề vị trí được đặt thành URL mong đợi https://some-site/Account/Settings và trang thích hợp được hiển thị.

Tuy nhiên, khi tôi thực hiện yêu cầu GET qua AJAX của JQuery, số $.get('https://some-site/SubApp/Account/Settings') mã trạng thái Trả lời là 401 Unauthorized nhưng vẫn có tiêu đề vị trí thích hợp.

Nội dung của phản hồi là trang lỗi IIS HTTP Error 401.0 - Unauthorized tiêu chuẩn.

Mọi thứ kỳ lạ dường như hoạt động tốt nếu tôi sử dụng các loại chuyển hướng Permanent hoặc Temporary trong cấu hình nhưng không thành công chỉ với Found.

/SubApp là một ứng dụng riêng biệt nằm bên dưới trang gốc tại /.

gì đang xảy ra?

Ảnh chụp màn hình

redirectType="Permanent" Permanent Redirect

redirectType="Found" Found Redirect

redirectType="Temporary" Temporary Redirect

Như bạn có thể nhìn thấy từ ảnh chụp màn hình các di chỉ fference là redirectType được chỉ định trong Web.config.

Như bạn có thể thấy các chuyển hướng đang diễn ra như mong đợi với ngoại lệ cho loại chuyển hướng Found mà tôi mong đợi nhận được phản hồi 302 - Found chuyển hướng đến cùng một URL với các URL khác.

+0

Bạn có thể thêm mã không. – Mairaj

+0

Bạn có thể thêm ảnh chụp màn hình lưu lượng mạng cho cả hai trường hợp (làm việc/không hoạt động) không? – drax

+0

Tôi có thể làm nhưng nó khá là '$ .get ("/BMS/Account/Settings ")'. Tôi sẽ cập nhật các câu hỏi với một số ảnh chụp màn hình ... – phuzi

Trả lời

5

Ahhhh, bạn biết khi nào bạn không suy nghĩ về một cái gì đó trong một thời gian và bạn nhận được nhấn với nguồn cảm hứng bất ngờ ... Vâng nó đã xảy ra đêm qua và tôi thấy nugget nhỏ này đưa ra để "sửa chữa" insistance MVC về chuyển hướng các yêu cầu AJAX khi xác thực thất bại ...

protected void Application_EndRequest() 
{ 
    var context = new HttpContextWrapper(Context); 
    // MVC retuns a 302 for unauthorized ajax requests so alter to request status to be a 401 
    if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest() && !context.Request.IsAuthenticated) 
    { 
     context.Response.Clear(); 
     context.Response.StatusCode = 401; 
    } 
} 

Và, không đáng ngạc nhiên, context.Request.IsAuthenticated luôn sai khi có vẻ như được đặt lại bằng chuyển hướng.

Đã cập nhật điều này, với một chút trợ giúp từ Branislav Abadjimarinov's blog post về chủ đề.

protected void Application_EndRequest() 
{ 
    var context = new HttpContextWrapper(Context); 
    // MVC returns a 302 for unauthorized ajax requests so alter to request status to be a 401 

    if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) 
    { 
     //Unfortunately the redirect also clears the results of any authentication 
     //Try to manually authenticate the user... 
     var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      if (authTicket != null && !authTicket.Expired) 
      { 
       var roles = authTicket.UserData.Split(','); 
       HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles); 
      } 
     } 

     if (!context.Request.IsAuthenticated) 
     { 
      context.Response.Clear(); 
      context.Response.StatusCode = 401; 
     } 

    } 
} 

Và tất cả đều hoạt động như mong đợi.

Chỉ có câu hỏi là tôi nên xóa câu hỏi này?

+4

Không xóa nó, nó có thể hữu ích cho khách truy cập trong tương lai –

0

Hãy xem điều này Cannot handle 302 redirect in ajax and why? [duplicate], có vẻ như trình duyệt web nhìn thấy Found-302 và thực hiện một hành động trên đó.

+0

Tôi sẽ kiểm tra lại vào ngày mai, nhưng phiên được xác thực đầy đủ và tôi thấy cả 301 có tiêu đề vị trí thì yêu cầu tiếp theo của trình duyệt đến vị trí mới với phản hồi trạng thái 200 khi được đặt thành 'Vĩnh viễn' tôi thấy chính xác như vậy ngoại trừ mã trạng thái 307 cho phản hồi đầu tiên khi 'redirectType' được đặt thành' Tạm thời'. Khi nó được thiết lập để 'Tìm thấy' tôi nhận được một 401 nhưng kỳ lạ tiêu đề vị trí được thiết lập để các nguồn tài nguyên tôi đã mong đợi chuyển hướng để trỏ đến. Tôi không cố gắng xử lý chuyển hướng theo cách thủ công và tiêu đề vị trí đang trỏ vào tài nguyên chính xác. – phuzi

+0

Brian, tôi có thể thiếu một thứ gì đó nhưng liên kết mà bạn đã đăng dường như không chuyển hướng các yêu cầu trái phép tới trang chuyển hướng bc trang ủy quyền không thể xảy ra trong ajax. Nếu vậy, sự hiểu biết của tôi về vấn đề OP là một cái gì đó hoàn toàn khác nhau. –

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