大家早上好,
我一直在尝试编写一个从需要身份验证的远程Web服务执行一些GET的应用程序。我的主要问题是这些远程服务器中的大多数(并且有很多)没有有效的证书。我有code to accept the invalid certificate和代码以正确的uname&pass(如下)来响应挑战。我遇到的问题是让两个人一起玩。我似乎找不到找到既发送NSURLCredential
挑战又无法正确链接回调的方法。当我尝试将它们链接时,我无法让NSURLRequest
两次调用didReceiveAuthenticationChallenge
。
任何想法将不胜感激!
身份验证代码...
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if(!hasCanceled){
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
badUsernameAndPassword = YES;
finished = YES;
}
}
}
最佳答案
您只能回复带有该挑战凭据的NSURLAuthenticationChallenge
。您可以使用以下方法确定收到的挑战类型:
[[challenge protectionSpace] authenticationMethod]
可能的值为documented here。如果服务器证书无效,则身份验证方法将为
NSURLAuthenticationMethodServerTrust
。在您的代码中,您应该检查身份验证方法并做出适当响应。if ([challenge previousFailureCount] > 0) {
// handle bad credentials here
[[challenge sender] cancelAuthenticationChallenge:challenge];
return;
}
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
// check if the user has previously accepted the certificate, otherwise prompt
} else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) {
[[challenge sender] useCredential:/* your user's credential */ forAuthenticationChallenge:challenge];
}
如果您没有每次都遇到两个身份验证挑战,那不是一个错误。您可以在创建凭据时缓存它们。如果这样做,则不一定会再次提示您。
关于iphone - NSURLConnection,NSURLRequest,不受信任的证书和用户身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2949640/