3

UIWebViewログインボタンのあるサイトに行きました。ログインボタンが押されると(たとえばSafariで)、ログインのプロンプトが表示され、ADを介して認証され、ユーザーがログインするWebサービスが呼び出されます。これを機能させようとしていますがUIWebViewdidReceiveAuthenticationChallengeと呼ばれる。何か案は?

- (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方法はありますか?

4

1 に答える 1

3

他の人が指摘したように、そのメソッドがトリガーされない理由の最も可能性の高い説明は、サーバーがHTTP 401 Unauthorized. そうして初めて、UIWebView はデリゲートdidReceiveAuthenticationChallengeメッセージを送信します。

特に、成功したケースを「ntfsログイン画面」(Windowsドメインのログオンダイアログを意味すると想定しています)と説明しているため、HTTPの一部ではないため、サーバーがログイン画面のように見えるように聞こえます。しかし、それは HTTP Auth ではありません。

考慮/試行事項:

  • cURLでURL にアクセスしてみて、実際に 401 が返されることを確認してください。

  • 401 が返されない場合、デスクトップ ブラウザに表示されるダイアログは、Javascript プロンプトか、そのように見えるように作成された HTML フォームです。Firebug や Chrome のインスペクターなどのツールを使用して、実際の資格情報が投稿されている URL を特定し、そこで UIWebView を起動してみてください。

  • 実際に 401 を取得している場合、デリゲートの接続を再確認してください。その場合、このメソッドはビューのデリゲートで呼び出す必要があります。

最後に、手動で発砲できるかどうかを尋ねますdidReceiveAuthenticationChallenge。もちろん、デリゲートにメッセージを送信してチャレンジを含めることもできますが、それはまったく必要ありません。サーバーが UIWebView によって行うのではなく、デリゲートにチャレンジすることです。 .

于 2012-05-18T06:59:44.100 に答える