身份验证挑战

Posted

技术标签:

【中文标题】身份验证挑战【英文标题】:Authentication Challenge 【发布时间】:2012-06-28 17:32:23 【问题描述】:

我尝试使用 webview 访问受保护的 web 文件夹。使用“硬编码”用户并通过它可以工作,但我的计划是弹出一个警报视图以输入用户并通过。这是代码的一部分:

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:    (NSURLAuthenticationChallenge *)challenge

NSLog(@"Need Authentication");

UIAlertView *webLogin = [[UIAlertView alloc] initWithTitle:@"Authentication" 
                                                   message:@"Enter User and Pass" 
                                                   delegate:self 
                                                   cancelButtonTitle:@"Cancel" 
                                                   otherButtonTitles:@"OK"
                                                   , nil];


webLogin.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
[webLogin show];


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

user = [[alertView textFieldAtIndex:0]text];
pass = [[alertView textFieldAtIndex:1]text];
NSLog(@"user is %@ and pass is %@",user,pass);

if (buttonIndex == [alertView cancelButtonIndex]) 

    [self dismissModalViewControllerAnimated:YES];

else if (buttonIndex != [alertView cancelButtonIndex]) 

    NSLog(@"OK Pressed");
    [self handleAuthentificationOKForChallenge:nil withUser:user password:pass];





- (void)handleAuthentificationOKForChallenge:(NSURLAuthenticationChallenge *)aChallenge     withUser:(NSString *)userName password:(NSString *)password 

NSURLCredential *credential = [[NSURLCredential alloc]
                               initWithUser:userName password:password
                               persistence:NSURLCredentialPersistenceForSession];
[[aChallenge sender] useCredential:credential forAuthenticationChallenge:aChallenge];


谁能告诉我如何调用handleAuthenticationOKForChallenge 我对 NSURLAuthenticationChallenge 有点困惑......

【问题讨论】:

【参考方案1】:

首先,如果两个if 语句正在比较同一个变量,则它们不应该一个接一个地使用它们。您的第二个if 语句应该是else if 语句。

看起来您的handleAuthentificationOKForChallenge 方法想要接受NSURLAuthenticationChallenge 的实例,但您目前只是传递它nil

为什么不在头文件中声明NSURLAuthenticationChallenge 的实例(我们称之为myChallenge),并在第一个方法中使用challenge 分配和初始化它。您也可以将其设置为等于挑战(如果您想先尝试一下,可能会起作用),但您可能会在某些时候丢失指针。 然后,您将在第二种方法中将您的行更改为:

[self handleAuthentificationOKForChallenge:myChallenge withUser:user password:pass];

让我知道这是否有效......

【讨论】:

如果更正 :-) 那么,你能告诉我如何初始化 ivar 吗? myChallenge = [[NSURLAuthenticationChallenge alloc] initWith ...? 尝试:myChallenge = [[NSURLAuthenticationChallenge alloc] initWithAuthenticationChallenge:challenge sender:challenge.sender]; 别工作!有不同的challenge和mychallenge值可以吗? 如果您从挑战中初始化 mychallenge,challenge 和 mychallenge 有何不同?你遇到了什么错误? 知道了! [webView loadRequest:req];我的方法中缺少。初始化 ivar myChallenge = 挑战是绝对正确的! thx4 你的帮助迪伦!!

以上是关于身份验证挑战的主要内容,如果未能解决你的问题,请参考以下文章

markdown 挑战:19.1测试本地身份验证

java.io.IOException : 未找到身份验证挑战

从未调用过 Swift 身份验证挑战 URLSession

Cordova 应用程序在 Android 上未收到基本身份验证挑战的问题

iis7 基于挑战和基于登录重定向的身份验证不能同时使用

使用 ISO 7816-4 APDU 的 DESFire 卡中的外部身份验证