ฉันต้องการส่งคำขออนุญาตโดยใช้การตรวจสอบสิทธิ์พื้นฐาน ฉันติดตั้งสำเร็จโดยใช้ jquery อย่างไรก็ตามเมื่อฉันได้รับข้อผิดพลาด 401 ป๊อปอัพเบราว์เซอร์การตรวจสอบสิทธิ์ขั้นพื้นฐานถูกเปิดขึ้นและไม่เรียกการเรียกกลับข้อผิดพลาด jquery ajax
ฉันต้องการส่งคำขออนุญาตโดยใช้การตรวจสอบสิทธิ์พื้นฐาน ฉันติดตั้งสำเร็จโดยใช้ jquery อย่างไรก็ตามเมื่อฉันได้รับข้อผิดพลาด 401 ป๊อปอัพเบราว์เซอร์การตรวจสอบสิทธิ์ขั้นพื้นฐานถูกเปิดขึ้นและไม่เรียกการเรียกกลับข้อผิดพลาด jquery ajax
คำตอบ:
เมื่อเร็ว ๆ นี้ฉันก็ประสบปัญหานี้เช่นกัน เนื่องจากคุณไม่สามารถเปลี่ยนลักษณะการทำงานเริ่มต้นของเบราว์เซอร์ในการแสดงป๊อปอัปในกรณีของ401
( การตรวจสอบสิทธิ์ขั้นพื้นฐานหรือการย่อย ) มีสองวิธีในการแก้ไขปัญหานี้:
401
. ส่งคืน200
รหัสแทนและจัดการสิ่งนี้ในไคลเอนต์ jQuery ของคุณเปลี่ยนวิธีการที่คุณใช้ในการอนุญาตเป็นค่าที่กำหนดเองในส่วนหัวของคุณ เบราว์เซอร์จะแสดงป๊อปอัพสำหรับขั้นพื้นฐานและDigest คุณต้องเปลี่ยนแปลงสิ่งนี้ทั้งในไคลเอนต์และเซิร์ฟเวอร์
headers : {
"Authorization" : "BasicCustom"
}
โปรดดูที่นี้สำหรับตัวอย่างของการใช้ jQuery กับตรวจสอบสิทธิ์พื้นฐาน
<security:http-basic/>
คุณไม่จำเป็นต้องกำหนดbasicAuthenticationFilter
แต่ควรกำหนดเป็น<security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
ไฟล์.
401
และ WWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
คุณรู้ไหมว่าทำไมถึงเป็นเช่นนั้น
ส่งคืนรหัสสถานะ 400 ทั่วไปจากนั้นประมวลผลฝั่งไคลเอ็นต์นั้น
หรือคุณสามารถเก็บ 401 ไว้และไม่ส่งคืนส่วนหัว WWW-Authenticate ซึ่งเป็นสิ่งที่เบราว์เซอร์ตอบสนองด้วยป๊อปอัปการตรวจสอบสิทธิ์ หากส่วนหัว WWW-Authenticate ขาดหายไปเบราว์เซอร์จะไม่แจ้งให้ป้อนข้อมูลรับรอง
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
คุณสามารถระงับป๊อปอัปการตรวจสอบสิทธิ์ขั้นพื้นฐานด้วย url คำขอที่มีลักษณะดังนี้
https://username:password@example.com/admin/...
หากคุณได้รับข้อผิดพลาด 401 (ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง) จะได้รับการจัดการอย่างถูกต้องด้วยการเรียกกลับข้อผิดพลาด jquery อาจทำให้เกิดปัญหาด้านความปลอดภัย (ในกรณีของโปรโตคอล http แทนที่จะเป็น https) แต่ก็ใช้งานได้
UPD:การสนับสนุนโซลูชันนี้จะถูกลบออกใน Chrome 59
https://user:pass@host/
ใน M59 ประมาณเดือนมิถุนายน 2017 ดูโพสต์ chromestatus บล็อกนี้สำหรับข้อมูลเพิ่มเติม
ดังที่คนอื่น ๆ ชี้ให้เห็นวิธีเดียวที่จะเปลี่ยนพฤติกรรมของเบราว์เซอร์คือตรวจสอบให้แน่ใจว่าการตอบกลับไม่มีรหัสสถานะ 401 หรือถ้าไม่มีก็ไม่ต้องรวมWWW-Authenticate: Basic
ส่วนหัว เนื่องจากการเปลี่ยนรหัสสถานะไม่ได้มีความหมายและไม่เป็นที่ต้องการแนวทางที่ดีคือการลบWWW-Authenticate
ส่วนหัวออก หากคุณไม่สามารถหรือไม่ต้องการแก้ไขแอปพลิเคชันเว็บเซิร์ฟเวอร์ของคุณคุณสามารถให้บริการหรือพร็อกซีผ่าน Apache ได้ตลอดเวลา (หากคุณไม่ได้ใช้ Apache อยู่แล้ว)
นี่คือการกำหนดค่าสำหรับ Apache เพื่อเขียนการตอบสนองใหม่เพื่อลบ IFF ส่วนหัวที่รับรองความถูกต้อง WWW ที่คำขอมีส่วนหัวX-Requested-With: XMLHttpRequest
(ซึ่งกำหนดโดยค่าเริ่มต้นโดยเฟรมเวิร์ก Javascript ที่สำคัญเช่น JQuery / AngularJS ฯลฯ ... ) และการตอบกลับประกอบด้วย WWW-Authenticate: Basic
ส่วนหัว
ทดสอบกับ Apache 2.4 (ไม่แน่ใจว่าใช้ได้กับ 2.2 หรือไม่) ขึ้นอยู่กับmod_headers
โมดูลที่กำลังติดตั้ง (บน Debian / Ubuntu sudo a2enmod headers
และรีสตาร์ท Apache)
<Location />
# Make sure that if it is an XHR request,
# we don't send back basic authentication header.
# This is to prevent the browser from displaying a basic auth login dialog.
Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
</Location>
proxy_hide_header WWW-Authenticate;
ใช้ X-Requested-With: XMLHttpRequest กับส่วนหัวคำขอของคุณ ดังนั้นส่วนหัวของการตอบกลับจะไม่มี WWW-Authenticate: Basic
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', ("Basic "
.concat(btoa(key))));
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
},
หากคุณใช้เซิร์ฟเวอร์ IIS คุณสามารถตั้งค่า IIS URL Rewriting (v2) เพื่อเขียนWWW-Authentication
ส่วนหัวใหม่None
ใน URL ที่ร้องขอ
response_www_authenticate
ค่าที่คุณต้องการที่จะเปลี่ยนแปลง
หากคุณต้องการข้อมูลเพิ่มเติมเพิ่มความคิดเห็นแล้วฉันจะโพสต์ไฟล์ web.config
หากส่วนหัว WWW-Authenticate ถูกลบออกคุณจะไม่ได้รับการแคชข้อมูลรับรองและจะไม่ได้รับส่วนหัวการอนุญาตกลับมาในคำขอ นั่นหมายความว่าตอนนี้คุณจะต้องป้อนข้อมูลรับรองสำหรับทุกคำขอใหม่ที่คุณสร้างขึ้น
หรือหากคุณสามารถปรับแต่งการตอบสนองของเซิร์ฟเวอร์คุณสามารถส่งคืน 403 Forbidden
เบราว์เซอร์จะไม่เปิดป๊อปอัปการรับรองความถูกต้องและการเรียกกลับ jquery จะถูกเรียก
ใน Safari คุณสามารถใช้คำขอแบบซิงโครนัสเพื่อหลีกเลี่ยงไม่ให้เบราว์เซอร์แสดงป๊อปอัป แน่นอนว่าควรใช้คำขอแบบซิงโครนัสในกรณีนี้เพื่อตรวจสอบข้อมูลรับรองของผู้ใช้เท่านั้น ... คุณสามารถใช้คำขอดังกล่าวก่อนที่จะส่งคำขอจริงซึ่งอาจทำให้ผู้ใช้ได้รับประสบการณ์ที่ไม่ดีหากเนื้อหา (ที่ส่งหรือรับ) ค่อนข้างหนัก
var xmlhttp=new XMLHttpRequest;
xmlhttp.withCredentials=true;
xmlhttp.open("POST",<YOUR UR>,false,username,password);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
สร้าง / เข้าสู่ระบบ URL แทนที่จะยอมรับพารามิเตอร์ "ผู้ใช้" และ "รหัสผ่าน" ผ่าน GET และไม่ต้องการการตรวจสอบสิทธิ์ขั้นพื้นฐาน ที่นี่ใช้ php, node, java, อะไรก็ได้และแยกวิเคราะห์ไฟล์ passwd ของคุณและจับคู่พารามิเตอร์ (user / pass) กับมัน หากมีรายการที่ตรงกันให้เปลี่ยนเส้นทางไปที่http: // user: pass@domain.com/ (สิ่งนี้จะตั้งค่าข้อมูลรับรองในเบราว์เซอร์ของคุณ) หากไม่มีให้ส่งการตอบกลับ 401 (โดยไม่มีส่วนหัว WWW-Authenticate)
จากด้านหลังด้วย Spring Boot ฉันใช้ BasicAuthenticationEntryPoint แบบกำหนดเอง:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().authorizeRequests()
...
.antMatchers(PUBLIC_AUTH).permitAll()
.and().httpBasic()
// https://www.baeldung.com/spring-security-basic-authentication
.authenticationEntryPoint(authBasicAuthenticationEntryPoint())
...
@Bean
public BasicAuthenticationEntryPoint authBasicAuthenticationEntryPoint() {
return new BasicAuthenticationEntryPoint() {
{
setRealmName("pirsApp");
}
@Override
public void commence
(HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
throws IOException, ServletException {
if (request.getRequestURI().equals(PUBLIC_AUTH)) {
response.sendError(HttpStatus.PRECONDITION_FAILED.value(), "Wrong credentials");
} else {
super.commence(request, response, authEx);
}
}
};
}