IIS 7.5 : Windows 인증으로 사용자 지정 인증 오류 페이지를 구성하는 방법 401 헤더 문제


14

IIS 7.5에서 실행되는 PHP 웹 사이트가 있습니다. 이 사이트는 Windows 인증으로 보호되며 정상적으로 작동합니다.

Windows 인증이 켜져 있습니다

사용자가 사이트를 방문하면 사용자 이름 / 암호를 묻는 메시지가 표시되고 인증되면 통과합니다. 사용자가 취소를 클릭하거나 비밀번호를 세 번 잘못 입력하면 401 오류 페이지가 표시됩니다.

못생긴 401 페이지

이제 로그인 방법을 설명하는 사용자 정의 페이지를 표시하고 싶습니다. 오류 페이지로 이동하여 상태 코드 401.2를 선택하고 표시하려는 페이지를 가리 킵니다.

오류 페이지 설정

그런 다음 모두에게 맞춤 오류가 설정되어 있는지 확인하십시오. 그리고 카아 붐! 인증이 더 이상 작동하지 않으며 사용자에게 비밀번호 프롬프트가 표시되지 않습니다. 설명서에서 알 수 있듯이 Windows 인증은 먼저 401 응답을 보내어 작동 한 다음 브라우저는 사용자에게 공급자 자격 증명을 요청한 다음 다음에 수행 할 작업을 해결합니다.

여기서 일어나는 일 : 페이지를 처음 요청하면 IIS는 401 헤더를 보내려고하지만 web.config에 "401로이 페이지로 리디렉션합니다"라는 메시지가 표시됩니다. 인증 대신 리디렉션 페이지 만 제공합니다.

나는 401, 401.1, 401.2를 대체하려고 시도했지만 아무런 차이가 없었습니다.

내가 뭘 잘못하고 있으며 사용자 인증 오류에 대한 맞춤 페이지를 제공하는 방법은 무엇입니까?

ps 다음은 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>

답변:


15

이 시도:

변화:

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

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

응답 모드 인 'File'IIS는 해당 파일의 내용을로드하고 표시 만해도 401 상태를 클라이언트로 다시 보냅니다.

나는 'ExecuteURL'을 사용했지만 파일 모드가 훨씬 잘 작동한다는 것을 알게되었습니다. 오류 페이지의 링크 된 자원이 여전히 작동하는지 확인해야합니다.


1
선생님, 당신은 스타입니다! 첫 번째 시도에서 문제가 해결되었습니다!
trailmax

2

사용자 지정 httperrors를 추가 한 후 자격 증명을 묻는 메시지가 표시되지 않는 동일한 문제가 발생하여 subStatusCode 0으로 해결할 수있었습니다. 이것이 누군가를 돕기를 바랍니다.

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

1

그래서 브라우저에 메시지를 표시하지 않는 것과 동일한 Basic Auth 문제로 어려움을 겪고있었습니다. 401.0의 사용자 지정 오류를 강제로 적용 (즉, 명시 적으로 하위 코드를 0으로 설정)하거나 레지스트리 키 생성을 설정해도 문제가 해결되지 않았습니다.

처음에는 사용자 정의 오류 페이지를 사용하는 것으로 나타났습니다. 그것들을 끄면 모든 것이 정상적으로 작동하고 다시 켜졌습니다 ... 특히 401 (0) 및 401.2 오류는 프롬프트를 막았습니다.

'ExecuteURL'에서 사용자 정의 오류 유형을 'File'로 설정하면 문제가 해결되었지만 사용자가 프롬프트를 취소하거나 잘못된 비밀번호를 입력 한 경우 일반 "이 디렉토리 또는 페이지를 볼 수있는 권한이 없습니다"가 표시됩니다.

다양한 게시물에서 힌트를 많이 얻었지만 정확한 '방법'또는 '왜'는 결코 아닙니다 ... 사이트의 하위 디렉토리에있는 사용자 정의 오류 파일의 상대 경로를 사용하고있었습니다. 경로를 절대 경로로 변경하면 취소되거나 잘못된 암호 인 경우 위의 일반 오류가 "이 페이지를 표시 할 수 없습니다"로 대체되었습니다. 조금 더 파고 게시물을 찾았 습니다기본적으로 false로 설정되어있는 구성 속성 "allowAbsolutePathsWhenDelegated"에 대해 설명합니다. 또한 고객 오류 파일을 사이트 루트에 넣은 다음 사용자 정의 오류 위치에 파일 이름 (예 : 사이트 루트의 상대 경로) 만 있으면 작동하지만 충분하다고 확신합니다. , 나는 내 사이트의 루트에 사용자 정의 오류를 넣고 싶지 않았습니다. 그래서 ConfigurationEditor를 사용하여 위의 특성을 true로 설정하고 사용자 지정 오류 파일의 절대 경로를 설정하면 모든 것이 제대로 작동하기 시작했습니다. 프롬프트가 유지되고 트리거 될 때 사용자 정의 오류가 표시됩니다.

내가 원하는 것은 중첩 된 상대 경로와 함께 File 속성을 사용할 수 있다는 것입니다. 그러나 지금까지 왜 내가 할 수 없거나 어떻게 해야하는지 알지 못했습니다. 다른 질문은 절대 경로를 사용하여 잠재적으로 보안 허점을 만드는 경우입니다 (즉, 왜 이것이 기본적으로 비활성화되어 있습니까?)

어쨌든, 이것이 누군가를 돕기를 바랍니다.


0

내 경우에는 이상한 이유로 2 개의 솔루션을 조합하여 asp.net MVC 5에서 효과가있었습니다.

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

이것이 정답으로 정답입니다.
Luminous

상태 코드가 다릅니다.
Teoman shipahi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.