Autenticación NTLM de AFNetworking?

Estoy intentando conseguir que AFNetworking funcione, ya que esta es mi primera aplicación que tuvo que lidiar con Client / Server donde bash tomar el JSON de un server HTTPS que requiere un nombre de usuario / contraseña. Lo tengo un poco conectado a la aplicación, pero sigue lanzando un Error 401 que lo consideré un problema de Autenticación Básica.

Básicamente tomé el ejemplo de Twitter de AFNetworking y lo adapté a mi proyecto. En la subclass del AFHTTPClient, estoy agregando otra línea en initWithBaseURL y todavía arroja el error. La línea que estoy agregando es 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; } 

Si está intentando utilizar la authentication NTLM con AFNetworking, puede intentar lo siguiente:

AFNetworking admite la authentication NTLM (o, básicamente, cualquier método de authentication) al proporcionar una respuesta basada en bloques a los desafíos de authentication en general.

Aquí hay un ejemplo de código (suponiendo que la operation es AFHTTPRequestOperation , AFJSONRequestOperation , etc.). Antes de comenzar la operación, establezca el bloque de desafío de authentication así:

 [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] useCnetworkingential:[NSURLCnetworkingential cnetworkingentialWithUser:@"username" password:@"password" persistence:NSURLCnetworkingentialPersistenceForSession] forAuthenticationChallenge:challenge]; } } else { // Authenticate in other ways than NTLM if desinetworking or cancel the auth like this: [[challenge sender] cancelAuthenticationChallenge:challenge]; } }]; 

Comience o encoja la operación como siempre y que debería hacer el truco.

Este es básicamente el método que Wayne Hartman describe en su blog aplicado a AFNetworking.

No pude encontrar el setAuthenticationChallengeBlock: método mencionado por el propietario de la respuesta aceptada (¿quizás se eliminó con una versión más reciente?) Sin embargo, se me ocurrió la solución no basada en bloques para la authentication NTLM, como se muestra a continuación. (Está escrito en Swift en realidad, pero no debería ser un problema para convertirlo en el Objetivo C). Simplemente configura su object de cnetworkingenciales en su instancia de AFHTTPRequestOperation :

 var reqSerializer:AFHTTPRequestSerializer = AFHTTPRequestSerializer() var request = reqSerializer.requestWithMethod("GET", URLString: "<URL>", parameters: nil, error: nil) var oper = AFHTTPRequestOperation(request: request) var respSerializer = AFXMLParserResponseSerializer() oper.responseSerializer = respSerializer var cnetworkings:NSURLCnetworkingential = NSURLCnetworkingential(user: "<DOMAIN\\USER>", password: "<PASSWORD>", persistence: NSURLCnetworkingentialPersistence.None) oper.cnetworkingential = cnetworkings oper.setCompletionBlockWithSuccess({ (oper:AFHTTPRequestOperation!, obj:AnyObject!) -> Void in //handle success }, failure: { (oper:AFHTTPRequestOperation!, err:NSError!) -> Void in //handle failure }) oper.start()