「ネゴシエート」HTTP 認証方式は iOS アプリでサポートされていますか?
この認証方式を使用するサーバーにアクセスしようとしています。現在、CFNetwork ライブラリを内部的に使用する ASIHTTPRequest クラスを使用しています。認証が行われず、ASIHTTPRequest コードをトレースすると、CFHTTPAuthenticationCreateFromResponse 関数を呼び出して作成された CFHTTPAuthentication オブジェクトが CFHTTPAuthenticationIsValid 関数によるチェックに失敗した後に失敗することがわかります。返されるエラーは「kCFStreamErrorHTTPAuthenticationTypeUnsupported = -1000」です。CFHTTPAuthentication の作成を試みるために使用する応答には、「WWW-Authenticate = Negotiate」ヘッダーが含まれています。これは、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;
また、Negotiate スキーム自体についてもやや混乱しています。私が理解しているように、可能であれば Kerberos スキームを使用しようとし、そうでない場合は NTLM スキームにフォールバックすることになっています。NTLM スキームは iOS でサポートされていますが、少なくとも CFHTTPAuthenticationCreateFromResponse がそれを処理する方法では、このフォールバックは発生していないようです。