0

RestKit 是否支持NTLM 身份验证?如何在我的项目中使用它?

4

2 回答 2

0

我必须继承 RKObjectManager 并覆盖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];
}
于 2013-04-18T19:16:31.183 回答
0

目前,RestKit 不支持 NTML 身份验证,但是有一个解决方法: 1. 在登录页面中,使用 NSURLRequest 加载请求身份验证的 url 并注册身份验证委托:

    - (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];
    }
}

其他页面无需认证即可正常使用RestKit。我只是用 SharePoint 服务器测试它,因为它在 cookie 中保存身份验证,不确定它是否适用于其他服务器。

玩得开心!:)

ps:iOS中如何做NTLM认证

于 2012-07-16T04:44:50.370 回答