didReceiveAuthenticationChallenge tidak dipanggil

Saya mendapat UIWebView mengunjungi situs yang memiliki tombol masuk. Setelah tombol login ditekan (misalnya di Safari), ia meminta login, lalu memanggil layanan web yang mengautentikasi melalui AD dan mencatat pengguna. Saya mencoba membuat ini berfungsi di UIWebView saya, tetapi didReceiveAuthenticationChallenge tidak pernah dipanggil. Ada ide?

- (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;
}

Apakah ada cara untuk memanggil metode didReceiveAuthenticationChallenge secara manual?


person DavidB    schedule 16.05.2012    source sumber
comment
Metode tersebut adalah untuk memberikan kredensial sebagai respons terhadap tantangan HTTP Auth dari server, bukan untuk melakukan autentikasi berbasis formulir yang lebih umum. Apakah Anda yakin situs tersebut menggunakan HTTP Auth?   -  person John Haager    schedule 17.05.2012
comment
Hai John, ya, ini bukan otentikasi berbasis formulir. Ketika tombol login ditekan pada halaman (di Safari) pengguna akan diarahkan dengan layar login ntfs, yang seharusnya memicu metode ini, tetapi karena alasan tertentu, ternyata tidak.   -  person DavidB    schedule 17.05.2012


Jawaban (1)


Seperti yang telah dicatat orang lain, penjelasan yang paling mungkin mengapa Anda tidak memicu metode tersebut adalah karena server tidak mengembalikan HTTP 401 Unauthorized. Hanya dengan begitu UIWebView akan mengirimkan pesan didReceiveAuthenticationChallenge kepada delegasinya.

Terutama karena Anda mendeskripsikan kasus yang berhasil sebagai "layar masuk ntfs" -- yang saya asumsikan yang Anda maksud adalah dialog masuk domain Windows -- yang bukan bagian dari HTTP, sepertinya server membuatnya tampak seperti layar masuk, tapi itu bukan HTTP Auth.

Hal-hal yang perlu dipertimbangkan/dicoba:

  • Coba tekan URL dengan cURL dan konfirmasikan bahwa Anda memang mendapatkan 401.

  • Jika Anda tidak mendapatkan 401, maka dialog yang Anda lihat di browser desktop Anda adalah prompt Javascript atau formulir HTML yang dibuat agar terlihat seperti itu. Coba gunakan alat seperti Firebug atau inspektur Chrome untuk mencari tahu ke URL mana kredensial sebenarnya diposting, dan mulai UIWebView Anda di sana.

  • Jika Anda sebenarnya mendapatkan 401, mungkin periksa kembali koneksi delegasi Anda? Dalam hal ini, metode ini harus dipanggil pada delegasi tampilan.

Terakhir: Anda bertanya apakah Anda dapat mengaktifkan didReceiveAuthenticationChallenge secara manual: tentu saja Anda dapat mengirim pesan ke delegasi Anda, dan menyertakan tantangan, namun bukan itu yang Anda inginkan: justru Anda yang menantang delegasi daripada server yang melakukannya dengan UIWebView Anda.

person ckhan    schedule 18.05.2012