NSURLConnection仅在第二次尝试时进行身份验证

时间:2013-06-15 05:12:31

标签: ios nsurlconnection afnetworking nsurlrequest

我正在尝试在UIWebView中加载一个安全的网站我的基本方法是创建一个NSURL,一个NSURLRequest,然后一个NSURLConnection,然后在UIWebView中加载NSURLRequest。网站加载后我收到了

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

我用

回复挑战发件人
- (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

但在那之后我什么都没得到......它只是挂了。我提出了分数,所以我知道

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
正在呼叫

。如果我等到我确定NSURLConnection没有完成,那么重新加载视图不会发送身份验证质询,但视图将加载。我对服务器没有任何控制权。我愿意使用AFNetworking,但仅在必要时使用。

源代码的完整列表如下:

 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:

    (NSURLAuthenticationChallenge *)challenge
    {
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
      if ([challenge previousFailureCount] == 0)
  {
    NSString *username = @"username";
    NSString *password = @"passsword";
    NSURLCredential * cred = [NSURLCredential credentialWithUser:username
                                                        password:password
                                                     persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
  }
  else
  {

  }
}

-(void)updateCard
{
  NSURL * url = [NSURL URLWithString:@"https://ssl.letu.edu/applications/chapelattendance/attendance.html"];
  NSURLRequest * request = [NSURLRequest requestWithURL:url
                                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                                        timeoutInterval:50.0];
  self.webView =[[UIWebView alloc] initWithFrame:self.bounds];
  self.webView.delegate = self;
  [self.webView loadRequest:request];
  self.connection = [[ NSURLConnection alloc]initWithRequest:request delegate:self];
  [self.connection start];
}

我哪里出错了?

4 个答案:

答案 0 :(得分:4)

您需要先检索"身份验证方法"服务器请求:

[[challenge protectionSpace] authenticationMethod]

这些是上面的表达式返回的身份验证方法(字符串常量):

NSURLAuthenticationMethodDefault
NSURLAuthenticationMethodHTTPBasic
NSURLAuthenticationMethodHTTPDigest
NSURLAuthenticationMethodHTMLForm
NSURLAuthenticationMethodNegotiate
NSURLAuthenticationMethodNTLM
NSURLAuthenticationMethodClientCertificate
NSURLAuthenticationMethodServerTrust

然后,您有以下选择:

  1. 如果要提供给定身份验证方法的凭据,请调用 useCredential:forAuthenticationChallenge:

  2. 如果您不想自己处理该身份验证方法并希望系统尝试 要进行身份验证,您可以调用performDefaultHandlingForAuthenticationChallenge: 然后可能会失败或取决于系统是否能够处理该类型 身份验证以及是否可以在众所周知的存储中查找凭据。

  3. 如果您无法处理该身份验证方法 - 例如身份验证方法    例如NSURLAuthenticationMethodNTLM - 您可以跳过此保护     空间并尝试另一个保护空间     存在于此身份验证质询中。然后你可能得到一个     您的身份验证方法NSURLAuthenticationMethodHTTPBasic     能够处理。     为了拒绝您发送方法的当前保护空间     rejectProtectionSpaceAndContinueWithChallenge:到     验证挑战发件人。然后,NSURLConnection将发送     再一次willSendRequestForAuthenticationChallenge:给你     如果存在另一个保护空间,则委托另一个保护空间。

  4. 您可以尝试继续而不提供凭据。     可能,身份验证将失败。你可以尝试一下     发送消息continueWithoutCredentialForAuthenticationChallenge:     到身份验证质询发件人。

  5. 最后,您可以通过取消来取消请求     身份验证质询:发送cancelAuthenticationChallenge:     身份验证质询发件人。

  6. 注意:NSURLAuthenticationMethodHTTPBasicNSURLAuthenticationMethodHTTPDigest身份验证方法可以使用NSURLCredential创建的+credentialWithUser:password:persistence:对象进行处理

答案 1 :(得分:0)

如果有人出现并遇到同样的问题,请确保我想分享我找到的解决方案。使用AFNetworking。

以下是修订后的代码:

-(void)updateCard
{
  if(!self.webView)
  {
    self.webView =[[UIWebView alloc] initWithFrame:self.bounds];
    self.webView.delegate = self;
  }
  NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
  NSString *username = @"username";
  NSString *password = @"password";
  NSURL *url = [NSURL URLWithString:@"https://ssl.letu.edu/"];
  AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL: url];

  [client setAuthorizationHeaderWithUsername:username password:password];

  NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:@"applications/chapelattendance/attendance.html"
                                                parameters:nil];

  AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

  [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
  {
    [self.webView loadRequest:request];
  }
                                   failure: ^(AFHTTPRequestOperation *operation, NSError *error)
  {
    NSLog(@"Could not load chapel attendance");
  }];

  NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  [queue addOperation:operation];
}

答案 2 :(得分:0)

AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];

操作。 securityPolicy.allowInvalidCertificates = ;

答案 3 :(得分:0)

您需要使用http标头发送用户名和密码组合,以便在发送请求时对其进行身份验证。

NSData *authData = [@"username:password" dataUsingEncoding:NSASCIIStringEncoding];

NSString *authorization = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]];

[mutableRequest addValue:authorization forHTTPHeaderField:@"Authorization"];