2013-08-14 17 views
5

Một đồng nghiệp đã hỏi tôi hôm nay cách định cấu hình IIS 7.5 để sử dụng xác thực Windows tích hợp với mạo danh cho trang web mạng nội bộ đơn giản chỉ với nội dung tĩnh bị hạn chế đối với một nhóm cụ thể trong Active Directory (ví dụ: "Quản trị viên").Cấu hình xác thực IIS Windows để trả về HTTP 403 thay vì HTTP 401 cho phép người dùng đã xác thực

Chỉ ra rằng IIS gửi phản hồi HTTP 401 khi người dùng được xác thực không có quyền đối với tài nguyên yêu cầu. Sự cho phép bị từ chối có thể là kết quả của một tệp ACL NTFS, hoặc một ACL system.webServer/security/authorization được định nghĩa trong cấu hình IIS.

Tất cả các trình duyệt chính dường như diễn giải 401 này có nghĩa là người dùng cuối cung cấp thông tin đăng nhập tên người dùng/mật khẩu Windows không hợp lệ và do đó nhắc người dùng nhập tên người dùng/mật khẩu của họ. IE dường như nhắc tới 3 lần trước khi hiển thị nội dung/nội dung phản hồi 401. Chrome và Safari dường như liên tục nhắc người dùng.

Điều này có thể gây nhầm lẫn cho người dùng cuối, những người liên tục nhập tên người dùng/mật khẩu Windows hợp lệ, chỉ để được nhắc lại.

Cách tốt hơn sẽ cho IIS để trả về một HTTP 403 thay vì một HTTP 401:

403 Forbidden

Máy chủ hiểu yêu cầu, nhưng từ chối đáp ứng nó. Ủy quyền sẽ không trợ giúp và yêu cầu được lặp lại NÊN KHÔNG.

Nguồn: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4

Làm thế nào để bạn cấu hình IIS tích hợp Windows Authentication để gửi HTTP 401 cho lỗi đăng nhập và HTTP 403 cho phép từ chối?

Trả lời

6

gì đã không làm việc

tôi đã cố gắng chỉ là về mọi cấu hình hoán vị IIS không có may mắn. Tôi goofed xung quanh với các thiết lập nhà cung cấp xác thực Windows, như NTLM, đàm phán, và đàm phán: Kerberos. Không ai trong số họ dường như làm các trick. Đây không phải là quá nhiều bất ngờ vì các trình duyệt đang quyết định thử xác thực lại, mặc dù chúng có lẽ không nên.

401 Unauthorized

Yêu cầu đòi hỏi xác thực người dùng. Câu trả lời PHẢI bao gồm trường tiêu đề WWW-Authenticate (phần 14.47) có chứa một thách thức áp dụng cho tài nguyên được yêu cầu. Khách hàng CÓ THỂ lặp lại yêu cầu với trường tiêu đề Cấp phép phù hợp (phần 14.8). Nếu yêu cầu đã bao gồm thông tin đăng nhập Ủy quyền, thì phản hồi 401 cho biết rằng ủy quyền đã bị từ chối đối với các thông tin đăng nhập đó.

Nguồn: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2

gì đã làm công việc

tôi quyết định tận dụng một số xuống và bẩn ASP.NET để sửa lỗi này.Dưới đây thực hiện phản hồi viết lại với sự giúp đỡ của một vài tập tin văn bản trên máy chủ và biên dịch động ASP.NET. (Tôi chưa bao giờ sử dụng biên dịch động trước đây, nhưng, biên dịch dường như quá mức cần thiết cho một trang web tĩnh.)

Tệp Global.asax dưới đây móc sự kiện EndRequest, ghi lại phản hồi HTTP 401 vào HTTP 403 nếu người dùng thành công được xác thực là người dùng Windows, nhưng, vì một số lý do khác, yêu cầu bị từ chối (tôi cho rằng lý do phải là sự thất bại ủy quyền).

Tệp web.config chứa các mục nhập để định tuyến tất cả yêu cầu thông qua đường dẫn ASP.NET và từ chối truy cập vào bất kỳ người dùng được xác thực nào không phải là thành viên trong nhóm Windows "Bán hàng".

Giải pháp này giả sử bạn có một ứng dụng đang chạy trong chế độ đường ống tích hợp IIS (tức là chế độ cổ điển), bạn đã bật xác thực Windows và tắt tất cả các lược đồ xác thực khác.

/Global.asax:

<Script language="C#" runat="server"> 
    void Application_EndRequest() { 
      // rewrite HTTP 401s to HTTP 403s if the user is authenticated using 
      // integrated Windows auth with impersonation, but, 
      // the user lacks permissions to the requested URL 
      if (Context.User != null && 
        Context.User.Identity != null && 
         Context.User.Identity.IsAuthenticated && 
          Context.User is System.Security.Principal.WindowsPrincipal && 
           Context.Response.StatusCode == 401) 
      { 
       Context.Response.Clear(); 
       Context.Response.StatusCode = 403; 
      } 
     } 
</script> 

/web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <security> 
      <authorization> 
       <remove users="*" roles="" verbs="" /> 
       <add accessType="Allow" roles="Sales" /> 
      </authorization> 
     </security> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 

Để tham khảo trong tương lai, tôi đã tạo ra một Gist @ https://gist.github.com/steve-jansen/6234700

+0

này trông giống như một câu trả lời cho một vấn đề Tôi đang gặp. Ai có thể giải thích nơi các tập tin này được và/hoặc làm thế nào tôi kiểm tra chế độ đường ống. Ngoài ra nếu tôi muốn cho phép điều này cho tất cả mọi người thay vì chỉ bán hàng, làm thế nào để làm điều đó, hoặc tôi có thể chỉ để lại một phần ... – Rothrock

+0

@Rothrock Chỉ cần có điều này với IIS 8.5. Đã lãng phí 1,5 h để tìm ra lý do tại sao IIS đã từ chối vé Kerberos xuyên rừng của tôi với 401 thay vì cho tôi 403. Đây là lỗi, có cách nào tốt hơn để giải quyết vấn đề này không? 401 rõ ràng là mã trạng thái sai. Trông giống như một trò đùa MS điển hình với tôi. –