0

Is NTLM authentication supported by RestKit? How can I use it in my project?

Francesco Vadicamo
  • 5,522
  • 35
  • 29

2 Answers2

0

Currently, RestKit doesn't support NTML authentication, however there is a workaround for that: 1. In login page, uses NSURLRequest to load an url that requests authentication and registers authentication delegate:

    - (void) connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodNTLM)
    {
        /*    This is very, very important to check.  Depending on how your security policies are setup, you could lock your user out of his or her account by trying to use the wrong credentials too many times in a row.    */
        if ([challenge previousFailureCount] > 0)
        {
            [[challenge sender] cancelAuthenticationChallenge:challenge];

            UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Invalid Credentials" message:@"The credentials you saved for your account are invalid." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
        }
        else
        {
            [[challenge sender]  useCredential:[NSURLCredential credentialWithUser:@"someUser" password:@"somePassword" persistence:NSURLCredentialPersistenceForSession] forAuthenticationChallenge:challenge];
        }
    }
    else
    {
        //    Do whatever you want here, for educational purposes, I'm just going to cancel the challenge
        [[challenge sender] cancelAuthenticationChallenge:challenge];
    }
}

In the other pages, you can use RestKit normally without authentication. I just test it with SharePoint server since it keeps authentication in cookie, not sure it works with others.

Have fun! :)

Ps: How to do NTLM Authentication in iOS

thanhbinh84
  • 17,876
  • 6
  • 62
  • 69
0

I had to subclass RKObjectManager and override getObjectsAtPath:

- (void)getObjectsAtPath:(NSString *)path
          parameters:(NSDictionary *)parameters
             success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
             failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure
{
    NSParameterAssert(path);
    RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:path parameters:parameters];
    [operation setCompletionBlockWithSuccess:success failure:failure];

    //this is the part to handle ntlm authentication, which we arent able to do in RKObjectManager
    [[operation HTTPRequestOperation] setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) {
        NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession];
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    }];

    [self enqueueObjectRequestOperation:operation];
}
Zayin Krige
  • 3,229
  • 1
  • 35
  • 34