簡體   English   中英

iOS canAuthenticateAgainstProtectionSpace方法每次都不會調用

[英]iOS canAuthenticateAgainstProtectionSpace method not called every time

我正在嘗試執行SSL證書驗證並已實現委托canAuthenticateAgainstProtectionSpace

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:   (NSURLProtectionSpace*)protectionSpace
{
  OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust, &trustResult);
    if(status == errSecSuccess)
    {
    }
    else
    {
    }
}

但是,我注意到第一次為給定的URL調用此委托,但不會針對同一URL的后續嘗試進行調用。 我認為這與緩存的響應有關,所以我創建了NSURLRequest,如下所示:

NSURLRequest *request = [[NSURLRequest alloc]
                         initWithURL: [NSURL   URLWithString:_urlString]
                         cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                         timeoutInterval: 10
                         ];

NSURLConnection *connection = [[NSURLConnection alloc]  initWithRequest:request delegate:self];

這也無濟於事。 任何想法,我怎么能得到canAuthenticateAgainstProtectionSpace方法每次都能得到調用?

上面的答案並沒有解決實際問題。 這里的實際問題是,只有在應用程序打開時第一次為該URL建立連接時才會顯示身份驗證質詢。

正如解釋這里

TLS會話是處理器密集型的,Apple不希望您在每次與該URL建立連接時創建新的會話,因此它們會為您緩存一個。 在這種情況下,它會對你起作用,但你應該能夠通過包含“。”來解決這個問題。 主持人結束時的角色。

在我們的例子中,我們嘗試建立與包含由內部CA頒發的證書的Web服務器的連接。 由於我們知道在第一次連接時不會信任CA,因此我們允許連接繼續以便可以下載CA. 在那個連接期間,我們添加“。” 字符到主機的末尾。 所有后續連接都使用不帶“。”的常規URL。 主持人結束時的角色。 這可確保我們下載的CA證書在第一次進行“真正”連接時得到驗證。

我通過添加以下代碼解決了這個問題:

- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
 [[challenge sender] cancelAuthenticationChallenge:challenge];
}   

以上取消了身份驗證挑戰,因此每次都會調用委托者canAuthenticateAgainstProtectionSpace

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM