ios - AFNetworking NTLM 身份验证?

标签 ios objective-c authentication afnetworking ntlm

我正在努力让 AFNetworking 工作,因为这是我的第一个必须处理客户端/服务器的应用程序,我试图从需要用户名/密码的 HTTPS 服务器获取 JSON。我将它与应用程序连接起来了,但它一直抛出 401 错误,我查了一下这是基本身份验证问题。

我基本上采用了 AFNetworking 中的 twitter 示例并将其改编到我的项目中。在 AFHTTPClient 的子类中,我在 initWithBaseURL 中添加了另一行,它仍然会抛出错误。我要添加的行是 setAuthorizationHeaderWithUsername

- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
    return nil;
}

[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];
[self setAuthorizationHeaderWithUsername:@"myusername" password:@"my password"];

return self;
}

最佳答案

如果您尝试将 NTLM 身份验证与 AFNetworking 结合使用,您可以尝试以下操作:

AFNetworking 通过提供对一般身份验证挑战的基于 block 的响应来支持 NTLM 身份验证(或基本上任何身份验证方法)。

这是一个代码示例(假设 operation 是一个 AFHTTPRequestOperationAFJSONRequestOperation 等)。在开始操作之前,像这样设置身份验证质询 block :

[operation setAuthenticationChallengeBlock:
 ^( NSURLConnection* connection, NSURLAuthenticationChallenge* challenge )
{
   if( [[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodNTLM )
   {
      if( [challenge previousFailureCount] > 0 )
      {
         // Avoid too many failed authentication attempts which could lock out the user
         [[challenge sender] cancelAuthenticationChallenge:challenge];
      }
      else
      {
         [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession] forAuthenticationChallenge:challenge];
      }
   }
   else
   {
      // Authenticate in other ways than NTLM if desired or cancel the auth like this:
      [[challenge sender] cancelAuthenticationChallenge:challenge];
   }
}];

像往常一样启动或排队操作,这应该可以解决问题。

这基本上就是 Wayne Hartman 的方法 describes in his blog适用于 AFNetworking。

关于ios - AFNetworking NTLM 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483465/

相关文章:

javascript - 在手机 block 屏幕上显示音频元数据?

ios - 使用 NSRange 获取子字符串

ios - 应用程序因 NSInvalidArgumentException 而崩溃

iphone - block 中对 self 的弱引用有时会导致 BAD_EXCESS

php - 如何在 PHP 中创建一个非常简单的用户名-密码登录?

ios - 在 iOS6 上断开 Facebook 与应用程序的连接?

ios - 我应该调整图像大小以在 UITableView 中显示吗?

ios - UITableViewControler 推送到另一个 TableViewController 图形问题

android - 如何确定移动应用程序中用户的登录状态

javascript - 消费者和 vendor 的 LTI 合规示例