iOS 应用程序是否支持“协商”HTTP 身份验证方案?
我正在尝试访问使用此身份验证方案的服务器。我目前正在使用 ASIHTTPRequest 类,它在内部使用 CFNetwork 库。身份验证失败,并且通过 ASIHTTPRequest 代码跟踪我看到它在通过调用 CFHTTPAuthenticationCreateFromResponse 函数创建的 CFHTTPAuthentication 对象未能通过 CFHTTPAuthenticationIsValid 函数检查后失败。返回的错误是“kCFStreamErrorHTTPAuthenticationTypeUnsupported = -1000”。它用于尝试创建 CFHTTPAuthentication 的响应具有“WWW-Authenticate = Negotiate”标头。这让我觉得不支持协商方案。但是 CFHTTPAuthentication 的库文档将“kCFHTTPAuthenticationSchemeNegotiate”列为“
以下是来自 attemptToApplyCredentialsAndResume 方法的 ASIHTTPRequest.m 代码的相关部分。
// Read authentication data
if (!requestAuthentication) {
CFHTTPMessageRef responseHeader = (CFHTTPMessageRef) CFReadStreamCopyProperty((CFReadStreamRef)[self readStream],kCFStreamPropertyHTTPResponseHeader);
requestAuthentication = CFHTTPAuthenticationCreateFromResponse(NULL, responseHeader);
CFRelease(responseHeader);
[self setAuthenticationScheme:[(NSString *)CFHTTPAuthenticationCopyMethod(requestAuthentication) autorelease]];
}
//SNIP
// See if authentication is valid
CFStreamError err;
if (!CFHTTPAuthenticationIsValid(requestAuthentication, &err)) {
CFRelease(requestAuthentication);
requestAuthentication = NULL;
我对协商方案本身也有些困惑。据我了解,如果可能,它应该尝试使用 Kerberos 方案,如果没有,则回退到 NTLM 方案。iOS 支持 NTLM 方案,但这种回退似乎没有发生,至少不是 CFHTTPAuthenticationCreateFromResponse 处理它的方式。