2015-04-16 17 views
5

Tôi đang sử dụng Owin để lưu trữ Bộ điều khiển WebAPI. Tôi có phần mềm trung gian Owin thực hiện xác thực và đặt các thông tin sau nếu xác thực không thành công:Trang lỗi tùy chỉnh khi sử dụng Owin

context.Response.StatusCode = (int) HttpStatusCode.Unauthorized; 

Khi điều này xảy ra, tôi muốn hiển thị trang HTML với một số hướng dẫn cho người dùng. (Giống như "Bạn cần phải đăng nhập.")

Hiện tại tôi chỉ chuyển hướng người dùng đến trang accessdenied.html, nhưng tôi muốn nếu quyền truy cập bị từ chối được hiển thị trực tiếp mà người dùng không được chuyển hướng (Tôi không muốn trường Vị trí trong trình duyệt web thay đổi).

Tôi cho rằng tôi có thể tạo HTML ngay lập tức và thêm nó vào phản hồi, ví dụ bằng cách đọc nội dung HTML từ tài nguyên.

Câu hỏi của tôi là: Có thể tự động hiển thị trang lỗi bị từ chối truy cập tùy chỉnh bằng cấu hình không? Trong ASP.NET "traditioinal", nó đã có thể thiết lập customErrors trong web.config, nhưng điều này không xuất hiện để làm việc với Owin selfhost:

<customErrors> 
    <error statusCode="401" redirect="~/accessdenied.html"/> 
</customErrors> 

Trả lời

3

trong một dự án trước đây của tôi, tôi đã phải sử dụng một Owin middleware như thế này:

 app.Use((owinContext, next) => 
     {   
      return next().ContinueWith(x => 
      { 
       if (owinContext.Response.StatusCode == 500 /*or 401 , etc*/) 
       {       
        //owinContext.Response.Redirect(VirtualPathUtility.ToAbsolute("~/Home/Error")); 
        //this should work for self-host as well 
        owinContext.Response.Redirect(owinContext.Request.Uri.AbsoluteUri.Replace(request.Uri.PathAndQuery, request.PathBase + "/Home/Error")); 
       } 
      });     
     }); 

bạn phải đăng ký phần mềm trung gian trước tất cả những người khác.

Trong trường hợp này, tôi chuyển hướng người dùng đến chế độ xem Lỗi, nhưng theo thực tế chung, tôi sẽ nói tốt hơn là nên có trang tĩnh HTML.

Thực ra tôi nghĩ có một yêu cầu mở rộng để xử lý ngoại lệ toàn cầu. Have a look at this link...

+0

Điều này sẽ không hoạt động đối với máy chủ, vì 'VirtualPathUtility' là một phần của' System.Web' và yêu cầu IIS hoạt động bình thường. –

+0

Bạn nên sử dụng tùy chọn này thay thế: 'request.Uri.AbsoluteUri.Replace (request.Uri.PathAndQuery, request.PathBase +"/Home/Error ")' – tmoreira

+0

Nếu bạn trả lời.Redirect, nó sẽ thay đổi mã trạng thái HTTP thành 302. –

0

Tôi gặp phải vấn đề tương tự. Tôi đã thử đặt StatusCode và sau đó chuyển hướng tới trang 401. Nhưng Chuyển hướng thay đổi Mã trạng thái thành 302.

Tôi đã đưa ra giải pháp đọc 401.html viết cho Response. Nó làm việc cho tôi.

context.Response.StatusCode = 401; 
var path = HttpContext.Current.Server.MapPath("/401.html"); 
var html = System.IO.File.ReadAllText(path, Encoding.UTF8); 
context.Response.Write(html); 
+0

ngữ cảnh owin cung cấp cho bạn tùy chọn chuyển hướng. – Rajat

-1

owin cung cấp cho bạn một tùy chọn để chuyển hướng đến trang lỗi của bạn

context.Response.Redirect (errUrl); // ngữ cảnh là owinContext

Bạn không cần phải có bất kỳ Phương thức chuyển hướng hành động hoặc chuyển hướng Redirect đặc biệt nào.

+1

Vấn đề với điều này là bạn chỉ nhận được mã lỗi 404 khi bạn đã gọi phần mềm trung gian 'tiếp theo'. gửi lỗi tới người dùng –

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