问题标签 [nsurlcredentialstorage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
688 浏览

ios - NSURLCredentialStorage setDefaultCredential:不适用于 [NSURLSession sharedSession]

我很难过:我的应用程序需要连接到使用 HTTPS 的自签名证书并需要客户端身份验证的服务器。更糟糕的是,我实际上需要 iOS 媒体播放器来连接到该服务器,所以我已经完全按照 Apple 的说明进行操作:

但它只是行不通。所以我尝试手动向服务器发出请求:

我得到的只是这个错误:

现在,如果我设置自己的 NSURLSession 并使用 URLSession:didReceiveChallenge:completionHandler: 回调:

接着:

请注意我是如何使用 [session.configuration.URLCredentialStorage defaultCredentialForProtectionSpace:challenge.protectionSpace] 的,这是我认为 NSURLSession 的默认实现在收到身份验证质询时所做的。

这适用于这个特定的连接!这证明了凭证是可以的,并且在默认的 NSURLCredentialStorage 中正确注册为默认凭证。

但是围绕 didReceiveChallenge: 回调的任何解决方案都不好,因为我无法控制媒体播放器正在使用哪个 NSURLSession。

我已经尝试过CustomHTTPProtocol hack,但这也不起作用。

有什么建议吗?我已经浏览了所有类似的帖子,我找不到解决方案。这篇文章非常接近,但接受的答案对我来说没有意义,并且明显与 Apple 的文档相矛盾。

0 投票
1 回答
850 浏览

ios - 如何更改 NSURLSession 的凭据

我有以下问题:我正在向服务器发出请求,该服务器使用 HTTP 基本身份验证并给了我

  • 如果我不发送身份验证,则为 401
  • 如果我发送无效身份验证,则为 401
  • 如果我发送有效的身份验证但该用户禁止该资源,则为 403。

收到 401 时,我的 NSURLSession 非常友好,可以通过

然后我可以在其中修改发送到服务器的凭据。

但是,当收到 403 时,我遇到了问题。从那里我无法让会话使用除用于获取 403 之外的任何其他凭据。在 403 上,不询问代表(这没关系,它不是 401),所以我如何控制哪些凭据是将来为那个保护空间发送?即使手动清空共享的 NSURLCredentialStorage 和/或直接在那里设置正确的凭据也无济于事:

在此调用之后,正确的凭据是唯一在 NSURLCredentialStorage 中列出的凭据 - 但是下一次对服务器的调用仍将包含旧凭据,这将不可避免地导致另一个 403。

即使使用其reset(completionHandler: @escaping () -> Void)方法重置会话也无济于事。

TLDR ; 如何更改 NSURLSession 在给定保护域成功使用它们后继续使用的凭据?

0 投票
1 回答
546 浏览

ios - URLSession 凭据缓存允许使用不正确的凭据进行身份验证

我正在尝试在我的 iOS 应用程序中与我公司的 API 进行通信。我正在使用标准的 URLSession。

API 将负载平衡并自动重定向到不同的服务器,因此我实现了处理重定向的 URLSessionDelegate 和 URLSessionTaskDelegate 方法。

当我最初登录时,我将从http://our.api.com重定向到http://our1.api.com或其他具有不同服务器编号的 API 版本。我第一次使用http://our1.api.com进行身份验证时,它将尊重传入的授权标头和质询的 URLCredential。但是,如果我尝试使用已知的错误凭据再次对同一个 API 进行身份验证,则会使用旧的 URLCredential,并且当我无法进入 API 时,我可以进入。

有没有办法强制 URLSession从不使用缓存的 URLCredential,或者清除缓存的 URLCredentials?

创建 URLSession

调用 API

URLSessionDelegate 和 URLSessionTaskDelegate