IIS 7.5: Cách định cấu hình trang Lỗi xác thực tùy chỉnh với Xác thực Windows. Vấn đề tiêu đề 401


14

Tôi có một trang web php chạy dưới IIS 7.5. Trang web được bảo mật bởi xác thực Windows và hoạt động tốt:

Xác thực Windows được bật

Khi người dùng truy cập trang web, họ được yêu cầu tên người dùng / mật khẩu và thông qua nếu được xác thực. Nếu người dùng nhấp vào Hủy hoặc nhập sai mật khẩu 3 lần, họ sẽ hiển thị trang lỗi 401:

Trang xấu xí 401

Bây giờ tôi muốn hiển thị trang tùy chỉnh giải thích cách đăng nhập. Vì vậy, tôi đi đến các trang Lỗi, chọn mã trạng thái 401.2 và trỏ nó đến trang tôi muốn hiển thị:

Cài đặt trang lỗi

Sau đó, đảm bảo các lỗi tùy chỉnh được bật cho tất cả mọi người. Và kaa-boom! Xác thực không hoạt động nữa, người dùng không được hiển thị với dấu nhắc mật khẩu. Như tài liệu nói, Windows xác thực hoạt động bằng cách gửi trả lời 401 trước, sau đó trình duyệt yêu cầu người dùng cung cấp thông tin đăng nhập của nhà cung cấp và sau đó họ sẽ tìm ra việc cần làm tiếp theo.

Điều gì xảy ra ở đây: trong yêu cầu đầu tiên cho trang IIS cố gắng gửi tiêu đề 401, nhưng thông báo rằng web.config nói "trên chuyển hướng 401 đến trang này". Và thay vì xác thực, nó chỉ cung cấp cho trang chuyển hướng.

Tôi đã thử thay thế 401, 401.1, 401.2 - không có sự khác biệt.

Tôi đang làm gì sai và làm thế nào để cung cấp trang tùy chỉnh về lỗi xác thực người dùng?

ps Đây là web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpErrors errorMode="Custom">
            <remove statusCode="500" subStatusCode="-1" />
            <remove statusCode="404" subStatusCode="-1" />
            <remove statusCode="401" subStatusCode="-1" />
            <error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />
            <error statusCode="404" prefixLanguageFilePath="" path="/not_restricted/404.htm" responseMode="ExecuteURL" />
        </httpErrors>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
    <system.web>
        <identity impersonate="false" />
        <customErrors defaultRedirect="http://www.myserver.com/not_restricted/500.htm" mode="Off">
        </customErrors>
    </system.web>
</configuration>

Câu trả lời:


15

Thử đi:

thay đổi:

<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />

đến

<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />

Với chế độ phản hồi 'Tệp' IIS chỉ cần tải nội dung của tệp đó và hiển thị nó, nó vẫn gửi trạng thái 401 trở lại máy khách.

Tôi đã từng sử dụng 'ExecuteURL' nhưng đã học được rằng chế độ Tệp hoạt động tốt hơn nhiều. Bạn chỉ cần đảm bảo rằng mọi tài nguyên được liên kết trong các trang lỗi của bạn vẫn hoạt động.


1
Thưa bạn, bạn là một ngôi sao! Điều đó đã khắc phục vấn đề từ lần thử đầu tiên!
trailmax

2

Tôi gặp phải vấn đề tương tự người dùng không được nhắc nhở với thông tin đăng nhập sau khi thêm tùy chỉnh omeperrors và có thể sửa nó với một SubStatusCode bằng 0. Hy vọng điều này sẽ giúp được ai đó.

<error statusCode="401" subStatusCode="0" path="..." responseMode="ExecuteURL">

1

Vì vậy, tôi đã có một thời gian khó khăn với cùng một vấn đề chính xác của Basic Auth không nhắc trình duyệt. Không bắt buộc một lỗi tùy chỉnh là 401.0 (nghĩa là cài đặt mã con thành 0) một cách rõ ràng hoặc thiết lập việc tạo khóa đăng ký đã giải quyết nó cho tôi.

Hóa ra đó là việc chúng tôi sử dụng các trang lỗi tùy chỉnh để bắt đầu. Tắt chúng đi, mọi thứ đều hoạt động tốt, bật lại ... cụ thể là các lỗi 401 (0) và 401.2 đã ngăn chặn lời nhắc.

Đặt loại lỗi tùy chỉnh thành 'Tệp' từ 'ExecuteURL' đã giải quyết nó, nhưng nếu người dùng hủy lời nhắc hoặc nhập mật khẩu xấu, họ sẽ nhận được thông báo chung "Bạn không có quyền xem thư mục hoặc trang này".

Sau rất nhiều nhận được gợi ý từ các bài đăng khác nhau, nhưng không bao giờ là chính xác 'làm thế nào' hoặc 'tại sao' ... Tôi đang sử dụng một đường dẫn tương đối cho tệp lỗi tùy chỉnh trong thư mục con của trang web. Thay đổi đường dẫn thành một lỗi tuyệt đối khiến lỗi chung chung ở trên được thay thế bằng "không thể hiển thị trang này" nếu bị hủy hoặc mật khẩu xấu. Đào thêm một chút và tôi tìm thấy một bàinói về một thuộc tính cấu hình "allowAbsolutePathsWhenDelegated" được đặt thành false theo mặc định. Nó cũng nói rằng nếu bạn chỉ đặt tệp lỗi khách hàng trong thư mục gốc của trang web và sau đó ở vị trí lỗi tùy chỉnh chỉ là tên tệp (nghĩa là đường dẫn tương đối đến thư mục gốc của trang web) thì nó sẽ hoạt động ... , Tôi không muốn đặt các lỗi tùy chỉnh trong thư mục gốc của trang web của mình. Vì vậy, tôi đã sử dụng Trình cấu hình để đặt thuộc tính trên thành true, đặt đường dẫn tuyệt đối cho các tệp lỗi tùy chỉnh và mọi thứ bắt đầu hoạt động tốt. Nhắc vẫn còn, lỗi tùy chỉnh hiển thị khi được kích hoạt.

Điều tôi muốn là, để có thể sử dụng thuộc tính Tệp với đường dẫn tương đối lồng nhau, nhưng cho đến nay tôi vẫn chưa tìm ra lý do tại sao tôi không thể hoặc làm thế nào để làm điều này. Câu hỏi khác là, nếu bằng cách sử dụng một đường dẫn tuyệt đối, nếu tôi có khả năng tạo lỗ hổng bảo mật (nghĩa là tại sao điều này sẽ bị tắt theo mặc định?)

Dù sao, hy vọng điều này sẽ giúp ai đó.


0

Đối với một số lý do kỳ lạ trong trường hợp của tôi, kết hợp lên đến 2 giải pháp đã làm việc cho tôi cho asp.net MVC 5.

  <error statusCode="401" subStatusCode="0" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />

Đây là câu trả lời chính xác như câu trả lời được chấp nhận.
Sáng

mã trạng thái là khác nhau.
Teoman shipahi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.