DidReceiveAuthenticationChallenge ไม่ได้ถูกเรียก

ฉันมี UIWebView ไปที่ไซต์ที่มีปุ่มเข้าสู่ระบบ เมื่อกดปุ่มเข้าสู่ระบบ (เช่นใน Safari) ระบบจะแจ้งให้เข้าสู่ระบบ จากนั้นจะเรียกบริการเว็บที่ตรวจสอบสิทธิ์ผ่าน AD และเข้าสู่ระบบผู้ใช้ ฉันกำลังพยายามทำให้สิ่งนี้ทำงานใน UIWebView ของฉัน แต่ didReceiveAuthenticationChallenge ไม่เคยถูกเรียก มีความคิดอะไรบ้าง?

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
{
    NSLog(@"Authed = %d", _authed);

    NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authed);

    NSString *theURL = [[request URL] absoluteString];



    currentURL = [[request URL] absoluteString];

    if (!_authed) {
        _authed = NO;

        [[NSURLConnection alloc] initWithRequest:request delegate:self];
        NSLog(@"shouldStartLoadWithRequest Return NO");
        return NO;
    }

    NSLog(@"shouldStartLoadWithRequest Return YES");
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
{
    NSLog(@"got auth challange");

    NSLog(@"previousFailureCount = %d", [challenge previousFailureCount]);




    ch = challenge;


    [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"myusername" password:@"mypassword" persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge];

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
{
    NSLog(@"received response via nsurlconnection");

    _authed = YES;


    NSString *urladdress = currentURL;    
    NSURL *url = [NSURL URLWithString:urladdress];


    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    [itemWebView loadRequest:urlRequest];
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
{
    return NO;
}

มีวิธีการเรียกเมธอด didReceiveAuthenticationChallenge ด้วยตนเองหรือไม่


person DavidB    schedule 16.05.2012    source แหล่งที่มา
comment
วิธีดังกล่าวมีไว้เพื่อให้ข้อมูลรับรองเพื่อตอบสนองต่อความท้าทายในการตรวจสอบสิทธิ์ HTTP จากเซิร์ฟเวอร์ ไม่ใช่สำหรับการดำเนินการตรวจสอบสิทธิ์ตามแบบฟอร์มทั่วไป คุณแน่ใจหรือไม่ว่าไซต์ใช้ HTTP Auth   -  person John Haager    schedule 17.05.2012
comment
สวัสดีจอห์น ใช่ มันไม่ใช่การรับรองความถูกต้องตามแบบฟอร์ม เมื่อกดปุ่มเข้าสู่ระบบบนเพจ (ใน Safari) ผู้ใช้จะได้รับแจ้งด้วยหน้าจอเข้าสู่ระบบ ntfs ซึ่งควรจะทริกเกอร์วิธีการดังกล่าว แต่ด้วยเหตุผลบางประการ จึงไม่เป็นเช่นนั้น   -  person DavidB    schedule 17.05.2012


คำตอบ (1)


ดังที่คนอื่น ๆ ได้กล่าวไว้ คำอธิบายที่เป็นไปได้มากที่สุดว่าเหตุใดคุณจึงไม่ได้รับวิธีการนั้นเพื่อทริกเกอร์ก็คือเซิร์ฟเวอร์ไม่ส่งคืน HTTP 401 Unauthorized. จากนั้น UIWebView จะส่งเพื่อมอบสิทธิ์ข้อความ didReceiveAuthenticationChallenge

โดยเฉพาะอย่างยิ่งเมื่อคุณอธิบายกรณีที่ประสบความสำเร็จว่าเป็น "หน้าจอเข้าสู่ระบบ ntfs" ซึ่งฉันถือว่าคุณหมายถึงกล่องโต้ตอบการเข้าสู่ระบบโดเมน Windows ซึ่งไม่ได้เป็นส่วนหนึ่งของ HTTP ดูเหมือนว่าเซิร์ฟเวอร์จะทำให้ดูเหมือนหน้าจอเข้าสู่ระบบ แต่ไม่ใช่ HTTP Auth

สิ่งที่ต้องพิจารณา/ลอง:

  • ลองกด URL ด้วย cURL และยืนยันว่าคุณได้รับ 401 จริงๆ

  • หากคุณไม่ได้รับ 401 กล่องโต้ตอบที่คุณเห็นบนเบราว์เซอร์เดสก์ท็อปของคุณอาจเป็นพรอมต์ Javascript หรือรูปแบบ HTML ที่สร้างขึ้นให้มีลักษณะเหมือนกัน ลองใช้เครื่องมือเช่น Firebug หรือตัวตรวจสอบของ Chrome เพื่อดูว่า URL ใดที่ข้อมูลรับรองจริงถูกโพสต์ไปที่ และเริ่ม UIWebView ของคุณที่นั่น

  • หากคุณ กำลัง จริงๆ แล้วได้รับ 401 ลองตรวจสอบการเชื่อมต่อของผู้รับมอบสิทธิ์ของคุณอีกครั้งหรือไม่ ในกรณีนั้น ควรเรียกวิธีนี้กับผู้รับมอบสิทธิ์ของมุมมอง

สุดท้าย: คุณถามว่าคุณสามารถยิง didReceiveAuthenticationChallenge ด้วยตนเองได้หรือไม่ แน่นอนว่าคุณสามารถส่งข้อความถึงผู้รับมอบสิทธิ์ของคุณและรวมการท้าทายด้วย แต่นั่นไม่ใช่สิ่งที่คุณต้องการเลย นั่นคือ คุณ การท้าทายผู้รับมอบสิทธิ์ มากกว่า กว่าเซิร์ฟเวอร์ที่ทำโดย UIWebView ของคุณ

person ckhan    schedule 18.05.2012