IIS 7.5: วิธีกำหนดค่าหน้าข้อผิดพลาดการตรวจสอบสิทธิ์แบบกำหนดเองด้วย Windows Authentication ปัญหาส่วนหัว 401


14

ฉันมีเว็บไซต์ php ที่ทำงานภายใต้ IIS 7.5 ไซต์ดังกล่าวได้รับการรับรองความปลอดภัยโดยการรับรองความถูกต้องของ Windows และทำงานได้ดี:

Windows Authentication เปิดอยู่

เมื่อผู้ใช้ไปที่ไซต์พวกเขาจะถามชื่อผู้ใช้ / รหัสผ่านและผ่านหากได้รับการรับรองความถูกต้อง หากผู้ใช้คลิกยกเลิกหรือพิมพ์รหัสผ่านผิด 3 ครั้งพวกเขาจะแสดงหน้าข้อผิดพลาด 401:

หน้าน่าเกลียด 401

ตอนนี้ฉันต้องการแสดงหน้าเว็บที่กำหนดเองซึ่งอธิบายวิธีการลงชื่อเข้าใช้ ดังนั้นฉันไปที่หน้าข้อผิดพลาดเลือกรหัสสถานะ 401.2 และชี้ไปที่หน้าที่ฉันต้องการแสดง:

การตั้งค่าหน้าผิดพลาด

จากนั้นตรวจสอบให้แน่ใจว่าได้เปิดข้อผิดพลาดที่กำหนดเองสำหรับทุกคน และ kaa-boom! การรับรองความถูกต้องไม่ทำงานอีกต่อไปผู้ใช้จะไม่แสดงพร้อมท์รหัสผ่าน ตามที่เอกสารระบุว่าการพิสูจน์ตัวจริงของ Windows ทำงานโดยส่ง 401 คำตอบก่อนจากนั้นเบราว์เซอร์จะถามผู้ใช้ถึงข้อมูลประจำตัวของผู้ให้บริการ

จะเกิดอะไรขึ้นที่นี่: เมื่อมีการร้องขอครั้งแรกสำหรับหน้า IIS พยายามส่ง 401-header แต่สังเกตว่า web.config พูดว่า "ใน 401 เปลี่ยนเส้นทางไปยังหน้านี้" และแทนที่จะให้การรับรองความถูกต้องจะให้หน้าเปลี่ยนเส้นทาง

ฉันได้ลองแทนที่ 401, 401.1, 401.2 - ไม่ได้สร้างความแตกต่าง

ฉันทำอะไรผิดและจะให้หน้ากำหนดเองกับข้อผิดพลาดการตรวจสอบผู้ใช้

ป.ล. นี่คือ 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" />

ด้วยโหมดการตอบสนอง 'ไฟล์' IIS เพียงแค่โหลดเนื้อหาของไฟล์นั้นและแสดงมันก็ยังส่งสถานะ 401 กลับไปยังไคลเอนต์

ฉันเคยใช้ 'ExecuteURL' แต่ได้เรียนรู้ว่าโหมดไฟล์ใช้งานได้ดีกว่ามาก คุณเพียงแค่ต้องแน่ใจว่าทรัพยากรที่เชื่อมโยงในหน้าข้อผิดพลาดของคุณยังคงทำงาน


1
ท่านเป็นดารา! ที่แก้ไขปัญหาจากความพยายามครั้งแรก!
trailmax

2

ฉันพบปัญหาเดียวกันนี้ของผู้ใช้ที่ไม่ได้รับพร้อมกับข้อมูลประจำตัวหลังจากเพิ่ม httperrors ที่กำหนดเองและก็สามารถแก้ไขได้ด้วย subStatusCode เป็น 0 หวังว่านี่จะช่วยคนได้

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

1

ดังนั้นฉันจึงมีเวลากับปัญหาเดียวกันของ Basic Auth ที่ไม่แจ้งเบราว์เซอร์ ไม่บังคับให้เกิดข้อผิดพลาดที่กำหนดเองที่ 401.0 (เช่นการตั้งค่า subcode อย่างชัดเจนเป็น 0) หรือการตั้งค่าการสร้างคีย์รีจิสทรีจะแก้ไขให้ฉัน

กลับกลายเป็นว่าเราใช้หน้าข้อผิดพลาดที่กำหนดเองเพื่อเริ่มต้นด้วย ปิดใช้งานทุกอย่างทำงานได้ดีกลับมา ... โดยเฉพาะข้อผิดพลาด 401 (0) และ 401.2 ทำให้พรอมต์

การตั้งค่าประเภทข้อผิดพลาดที่กำหนดเองเป็น 'ไฟล์' จาก 'ExecuteURL' ได้ทำการแก้ไขแล้ว แต่ถ้าผู้ใช้ยกเลิกการแจ้งหรือใส่รหัสผ่านไม่ถูกต้องพวกเขาจะได้รับ "คุณไม่ได้รับอนุญาตให้ดูไดเรกทอรีหรือหน้านี้"

หลังจากได้รับคำแนะนำมากมายจากการโพสต์ต่าง ๆ แต่ไม่เคย 'ใช้' หรือ 'ทำไม' ... ฉันใช้พา ธ สัมพัทธ์สำหรับไฟล์ข้อผิดพลาดที่กำหนดเองซึ่งอยู่ในไดเรกทอรีย่อยของเว็บไซต์ การเปลี่ยนเส้นทางให้เป็นแบบสัมบูรณ์ทำให้เกิดข้อผิดพลาดทั่วไปด้านบนที่จะถูกแทนที่ด้วย "ไม่สามารถแสดงหน้านี้" ถ้ายกเลิกหรือรหัสผ่านไม่ถูกต้อง ขุดขึ้นมาอีกนิดหน่อยและฉันก็พบโพสต์พูดคุยเกี่ยวกับคุณลักษณะการกำหนดค่า "allowAbsolutePathsWhenDelegated" ซึ่งตั้งค่าเป็นเท็จโดยค่าเริ่มต้น นอกจากนี้ยังระบุด้วยว่าหากคุณใส่ไฟล์ข้อผิดพลาดของลูกค้าในรูทไซต์ของคุณและจากนั้นในตำแหน่งข้อผิดพลาดที่กำหนดเองเพียงชื่อไฟล์ (เช่นพา ธ ที่สัมพันธ์กับรูทของไซต์) มันจะทำงานได้ ... ฉันไม่ต้องการใส่ข้อผิดพลาดที่กำหนดเองในรูทของเว็บไซต์ของฉัน ดังนั้นฉันใช้ ConfigurationEditor เพื่อตั้งค่าคุณลักษณะดังกล่าวเป็นจริงตั้งค่าเส้นทางสัมบูรณ์ไปยังไฟล์ข้อผิดพลาดที่กำหนดเองและทุกอย่างเริ่มทำงานได้ดี ยังคงพรอมต์ข้อผิดพลาดที่กำหนดเองจะปรากฏขึ้นเมื่อถูกเรียก

สิ่งที่ฉันต้องการคือสามารถใช้แอตทริบิวต์ File กับเส้นทางที่ซ้อนกัน แต่จนถึงตอนนี้ฉันยังไม่พบสาเหตุที่ฉันทำไม่ได้หรือวิธีการทำเช่นนี้ คำถามอื่นคือถ้าใช้เส้นทางสัมบูรณ์หากฉันอาจสร้างช่องโหว่ความปลอดภัย (เช่นทำไมจะปิดใช้งานโดยค่าเริ่มต้น)

อย่างไรก็ตามหวังว่าสิ่งนี้จะช่วยให้ใครบางคน


0

ด้วยเหตุผลแปลก ๆ บางอย่างในการรวมกันของ 2 โซลูชันที่ทำงานกับฉันสำหรับ asp.net MVC 5

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

นี่คือคำตอบที่แน่นอนเป็นคำตอบที่ยอมรับ
การส่องสว่าง

รหัสสถานะแตกต่างกัน
Teoman shipahi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.