ส่งคำขอเว็บไปยังหน้าเว็บที่ต้องมีการรับรองความถูกต้องของ Windows

ฉันกำลังพยายามส่งคำขอไปยังหน้าเว็บโดยใช้คลาส WebRequest ใน .net URL ที่ฉันพยายามอ่านต้องใช้ Windows Authentication เนื่องจากฉันได้รับข้อยกเว้นที่ไม่ได้รับอนุญาต ฉันจะส่งข้อมูลรับรอง windows ไปยังคำขอนี้เพื่อให้สามารถรับรองความถูกต้องได้อย่างไร

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create( "http://myapp/home.aspx" );

request.Method = "GET";
request.UseDefaultCredentials = false;
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "username", "password", "domain" );

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Raises Unauthorized Exception

this.Response.Write( response.StatusCode );

รหัสข้างต้นส่งกลับข้อผิดพลาดต่อไปนี้

System.Net.WebException: The remote server returned an error: (401) Unauthorized.

ฉันสังเกตเห็นสิ่งหนึ่งขณะตรวจสอบรายละเอียดข้อยกเว้นคือ URL ที่ฉันพยายามเข้าถึงมีการเปลี่ยนเส้นทางไปยัง URL อื่น ซึ่งแจ้งให้ฉันระบุรายละเอียดการเข้าสู่ระบบ NT ฉันเชื่อว่าข้อมูลรับรองควรได้รับการส่งต่อไปยัง URL นี้เช่นกัน แต่เห็นได้ชัดว่ามันไม่ได้เกิดขึ้น


person Hemanshu Bhojak    schedule 25.08.2010    source แหล่งที่มา
comment
สิ่งนี้อาจช่วยได้: msdn.microsoft.com/en-us/library/ff647405 aspx   -  person NullUserException    schedule 25.08.2010
comment
ขอบคุณ การตั้งค่า PreAuthenticate เป็นจริงช่วยแก้ปัญหาของฉันได้   -  person Michael    schedule 18.06.2012


คำตอบ (4)


คุณควรใช้คุณสมบัติ Credentials เพื่อส่งผ่านหน้าต่าง ข้อมูลประจำตัวสำหรับบริการเว็บ

หากคุณต้องการส่งข้อมูลรับรองผู้ใช้ windows ปัจจุบันไปยังบริการ

request.Credentials = CredentialCache.DefaultCredentials;

ควรทำเคล็ดลับ มิฉะนั้น ให้ใช้ NetworkCredential ดังนี้:

request.Credentials = new NetworkCredential(user, pwd, domain);
person VinayC    schedule 25.08.2010
comment
ดังที่คุณเห็นในโค้ดที่ฉันโพสต์ ฉันกำลังใช้คลาส NetworkCredential เพื่อส่งการเข้าสู่ระบบ Windows ของฉัน แต่ถึงอย่างนั้นก็ไม่ได้ผล - person Hemanshu Bhojak; 25.08.2010
comment
คุณใส่รหัสทีหลัง - ฉันจำไม่ได้ว่าเห็นมัน ไม่ว่าข้อผิดพลาด 401 หมายความว่าข้อมูลรับรองอาจผิดหรืออาจหมายความว่าข้อมูลรับรองถูกต้อง แต่ผู้ใช้รายนั้นไม่สามารถเข้าถึง URL นั้นได้ ฉันขอแนะนำให้คุณตรวจสอบ URL บริการของคุณจากเบราว์เซอร์ หากใช้งานได้ก็ควรทำงานร่วมกับ WebRequest ด้วยเช่นกัน - person VinayC; 25.08.2010
comment
ฉันแก้ไขโพสต์และรวมรหัสแล้ว นอกจากนี้ ฉันสามารถเข้าถึง URL ในเบราว์เซอร์ด้วยข้อมูลประจำตัว แต่ไม่สามารถทำได้โดยใช้ WebRequest - person Hemanshu Bhojak; 26.08.2010
comment
ลองกับ request.PreAuthenticate = false; เหตุผลคือเซิร์ฟเวอร์ส่ง 401 เป็นการตอบสนองต่อความท้าทายและ WebRequest จะไม่ตอบสนองต่อความท้าทายเว้นแต่ว่าคุณสมบัตินี้เป็นเท็จ - person VinayC; 26.08.2010
comment
โชคไม่ดี! คำแนะนำสุดท้าย - ใช้เครื่องมือเช่น Fiddler (www.fiddler2.com) และเปรียบเทียบห่วงโซ่การตอบสนองคำขอจากเบราว์เซอร์ (ไปยังบริการ) กับสิ่งเดียวกันจาก WebRequest ดังที่คุณได้กล่าวไว้ว่าบริการนี้ทำงานจากเบราว์เซอร์ โดยการเปรียบเทียบคำขอ-การตอบกลับ คุณควรเข้าใจว่าปัญหาอยู่ที่ใด - person VinayC; 27.08.2010
comment
ตรวจสอบส่วนหัวของคุณใน exception.Response - สำหรับฉัน ฉันมีปัญหากับพร็อกซีของฉันรบกวน - person Troy Parsons; 03.04.2012
comment
request.PreAuthenticate ควรเป็นจริง หากคุณกำลังทำ WebRequest ภายในแทน HttpWebRequest นี้ คุณต้องตั้งค่า .Credentials บนวัตถุนั้นด้วย - person vapcguy; 21.04.2020

สำหรับการตรวจสอบสิทธิ์กับ WebService ให้ใช้ DefaultNetworkCredentials แทน DefaultCredentials:

request.Credentials = CredentialCache.DefaultNetworkCredentials;
person Vitaliy Ulantikov    schedule 24.10.2011
comment
วิธีนี้แก้ไขปัญหาที่ฉันพยายามแก้ไขมาเป็นเวลาหนึ่งสัปดาห์แล้ว ขอบคุณ! - person empz; 11.01.2013
comment
ฉันสงสัยว่าจะช่วยแก้ไขปัญหาปัจจุบันของฉันได้หรือไม่: stackoverflow.com/questions/67335532/ ? ฉันอ่านสิ่งที่ขัดแย้งกันเกี่ยวกับความแตกต่างระหว่างแต่ละรายการ ฉันจะพยายามโดยเร็วที่สุด - person AFract; 15.05.2021

ฉันกำลังพยายามเข้าถึงลิงก์ A ผ่านข้อมูลประจำตัวของ Windows จากนั้นลิงก์ A เปลี่ยนเส้นทางฉันไปที่ลิงก์ B โดยอัตโนมัติแต่ไม่ผ่านข้อมูลรับรอง Windows ที่ฉันให้มา จึงมีข้อผิดพลาด ฉันได้ request.AutoRedirect = false และวนซ้ำทุกครั้งที่ได้รับตำแหน่งในส่วนหัว เช่น ฉันทำการเปลี่ยนเส้นทางด้วยตนเองทุกครั้งที่ส่งผ่านข้อมูลประจำตัวของ Windows

สิ่งนี้ใช้ได้ผลสำหรับฉัน :)

person Hemanshu Bhojak    schedule 31.08.2010

เมื่อใช้ VS2015 request.UseDefaultCredentials = true; ได้ผลสำหรับฉัน!

person Rob Bowman    schedule 15.03.2016