2010-06-01 26 views
8

Chào mọi người,NSURLConnection, NSURLRequest, xác thực người dùng và xác thực không tin cậy

Tôi đã cố gắng viết một ứng dụng nhận được từ một dịch vụ web từ xa yêu cầu xác thực. Vấn đề chính của tôi là phần lớn các máy chủ từ xa này (và có rất nhiều máy chủ) không có chứng chỉ hợp lệ. Tôi đã có code to accept the invalid certificate và mã để phản hồi thử thách với thông báo un232 & vượt qua (bên dưới). Vấn đề tôi đang gặp là bắt hai người chơi cùng nhau. Tôi dường như không thể tìm ra cách để gửi thử thách cả hai NSURLCredential s hoặc một cách để chuỗi các cuộc gọi lại chính xác. Khi tôi cố gắng kết nối chúng, tôi không thể nhận được NSURLRequest để gọi didReceiveAuthenticationChallenge hai lần.

Bất kỳ suy nghĩ nào cũng sẽ được đánh giá cao!

Mã cho xác thực ...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if(!hasCanceled){ 
     if ([challenge previousFailureCount] == 0) { 
      NSURLCredential *newCredential; 
      newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone]; 
      [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     } 
     else { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 
      NSLog(@"Bad Username Or Password"); 
      badUsernameAndPassword = YES; 
      finished = YES; 
     } 
    } 
} 

Trả lời

9

Bạn chỉ có thể trả lời một NSURLAuthenticationChallenge và có chứng nhận cho thách thức đó. Bạn có thể xác định loại thử thách nào bạn đã nhận được bằng cách sử dụng:

[[challenge protectionSpace] authenticationMethod] 

Giá trị có thể là documented here. Trong trường hợp chứng chỉ máy chủ không hợp lệ, phương thức xác thực sẽ là NSURLAuthenticationMethodServerTrust. Trong mã của bạn, bạn nên kiểm tra phương thức xác thực và trả lời thích hợp.

if ([challenge previousFailureCount] > 0) { 
    // handle bad credentials here 
    [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    return; 
} 

if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) { 
    // check if the user has previously accepted the certificate, otherwise prompt 
} else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) { 
    [[challenge sender] useCredential:/* your user's credential */ forAuthenticationChallenge:challenge]; 
} 

Không phải là lỗi nếu bạn không nhận được cả hai thách thức xác thực mỗi lần. Bạn có thể lưu trữ thông tin xác thực khi tạo chúng. Nếu bạn làm như vậy, bạn sẽ không nhất thiết phải được nhắc lại.

+0

Làm việc như một sự quyến rũ. Cần thiết để triển khai phương thức "canAuthenticateAgainstProtectionSpace" một cách chính xác để ứng dụng của tôi gọi phương thức này. Nhưng sau đó tất cả là tốt. Cảm ơn! – Staros

Các vấn đề liên quan