1

Windows 認証のみで保護されている OData サービスへの接続をテストするために、C# アプリに機能を追加しようとしています。次のコード ブロックは、このテストを実行するために使用しているものです。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME));
CredentialCache myCache = new CredentialCache();

myCache.Add(new Uri(SERVICE_NAME), "Negotiate", new NetworkCredential(user, password));
resolver.Credentials = myCache;

//  Do a simple request
request.Credentials = myCache;
request.PreAuthenticate = true;
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.CookieContainer = new CookieContainer();
object response = request.GetResponse();  // This is where the exception is thrown

上記のコードを実行すると、前述の 401 - Unauthorized エラーが表示されます。ただし、Fiddler2 を実行すると、コードは正常に動作します。そのため、代わりに Wireshark を使用しています。さらに、このサービスは私のブラウザー (Chrome) 内で完璧に動作し、Wireshark を使用して認証の HTTP 要求/応答を比較すると、Chrome では次の点を除いてほぼ同じであることがわかります: Accept、User-Agent 、Accept-Encoding、および Accept-Language ヘッダーがありますが、私の C# アプリにはこれらがありません。その他の唯一の違いは、私の C# アプリでは NTLM ヘッダーに "Negotiate Seal" フラグが設定されているのに対し、Chrome ではこのフラグが設定されていないことです。

これらの違いにもかかわらず、サービスが 302 - リダイレクトを返すまで、認証フェーズは C# アプリで正常に機能しているようです。この時点で、アプリは新しくリダイレ​​クトされた URI で GET を試行し、401 を再度返します (Chrome が類似の GET を実行すると、HTTP 200 を受信します - OK で、順調に進みます)。

それで、これを引き起こす可能性のあるアイデアはありますか?サービスに問題がありますか?または私のコード?

どうもありがとう!-エリック

4

1 に答える 1

0

わかりました、丸 2 日間の調査で答えが見つかりました。上記のコードの 3 行目は、サービスの完全な URI (".../Northwind/Northwind.svc") を使用していました。要求がリダイレクトされると、資格情報は新しい URI に適用されなくなりました。解決策は、URI の先頭部分 ("...") のみを渡すことでした。私の愚かな間違い。

于 2013-06-19T16:46:01.880 に答える