2012-02-26 13 views
0

iOSアプリケーションが基本認証を使用してローカルApacheサーバーからファイルにアクセスしようとしています。ブラウザからすべて正常に動作し、制限されたフォルダ内の画像にアクセスするにはユーザー名とパスワードを入力する必要があります。しかし、アプリでいくつかの奇妙なことが起こっている。iOSが基本的なサーバー認証をバイパスしているようです

NSURLConnectionをサーバーに作成します(これは問題なく動作しています)。私の要求が初めてデリゲートメソッド- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeが呼び出されたときに発生します。テスト目的のために、私は空のNSURLCredentialで応答し、明らかに接続が失敗します。しかし、私が再度リクエストを行うと、デリゲートメソッドは呼び出されず、何らかの方法でイメージがダウンロードされ、認証なしで表示されます。私は本当に何が起こっているのか混乱しています!

- (IBAction)loginPressed 
{ 
    self.username = self.usernameField.text; 
    self.password = self.passwordField.text; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.0.2/secret/favicon.ico"]]; 
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
} 


- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data 
{ 
    [self.data appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    self.imageView.image = [UIImage imageWithData:self.data]; 
    self.errorLabel.text = @""; 
} 

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge previousFailureCount] == 0) { 
     NSURLCredential *newCredential = [NSURLCredential credentialWithUser:self.username password:self.password persistence:NSURLCredentialPersistenceNone]; 
     [challenge.sender useCredential:newCredential forAuthenticationChallenge:challenge]; 
    } else { 
     [challenge.sender cancelAuthenticationChallenge:challenge]; 
     self.errorLabel.text = @"Invalid Username and/or Password"; 
     self.imageView.image = [UIImage imageWithData:[[NSData alloc] init]]; 
    } 
} 
+0

コードを追加してください。 –

+0

これはかなり多くのコードが使用されています。私はログインボタンを使ってリクエストを送信しています。テキストフィールドを空白のままにすると、上記の結果が得られます。 –

+0

ところで、コードの最後の行が漏れています。 NSDataインスタンスを解放せずに作成しています。それ以外に、imageViewイメージを 'nil'に割り当てることができます。 –

答えて

3

あなたが異なるデリゲートコールバック、connection:didReceiveAuthenticationChallenge:を使用する必要があります。ここでは

は、コードの一部です。

- (void) connection:(NSURLConnection *)connection 
    didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 

    if ([challenge previousFailureCount] > 0) { 
     // Do something, like prompt for credentials or cancel the connection 
    } else { 
     NSURLCredential *creds = [NSURLCredential 
          credentialWithUser:@"someUser" 
            password:@"somePassword" 
           persistence:NSURLCredentialPersistenceForSession]; 

     [[challenge sender] useCredential:creds forAuthenticationChallenge:challenge]; 
    } 
} 
+0

私は、アプリケーションが認証チャレンジに応答せずに画像を実際にどのようにダウンロードして管理したかについて、まだ混乱しています。新しいデリゲートメソッドではまったく同じ問題が発生しています。 –

+1

@ruhatchキャッシュされた画像?別のイメージをダウンロードしてみてください。 –

+1

優れています。私は、この問題を避けるためにキャッシュポリシーを変更していません。 –

関連する問題