7

私の C# アプリは、NTLM 認証を使用する Web サーバーにヒットします。

(新しい HttpWebRequest を使用して) サーバーに対して行われた各要求は、個別に認証されていることがわかりました。言い換えると、すべての要求は 401 応答になり、その後、実際の応答を取得する前に NTLM ハンドシェイクの会話が発生します。

例えば:

最初の GET リクエスト:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM)

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM base64stuff)

-> GET xyz (Authorization: base64stuff)
<- 200

後続のリクエスト:

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided?

-> GET xyz (Authorization: base64stuff)
<- 200

(最初に、PreAuthenticate を false に設定すると、後続のリクエストは最初のリクエストのように見えました。つまり、「リクエスト」ごとに 3 つの基本的なリクエストです)

サーバーへの最初のリクエストで実行された認証を、後続の HttpWebRequests と「共有」する方法はありますか?

プロパティを使用するとこれが可能になるのではないかと考えUnsafeAuthenticatedConnectionSharingましたが、アプリで使用されるすべての HttpWebRequest オブジェクトに対して true に設定しても効果はありません。

ただし、PreAuthenticatetrue に設定すると、最初のリクエストの後の各リクエストで発生する 401 レスポンスが 1 つ少なくなります。

4

2 に答える 2

4

NTLMの実行後に送信された最後の要求(200応答になる要求)には、サーバーに正しい資格情報があることを通知する認証ヘッダーが含まれています。

クライアントクラスにこれを独自に保持する機能があるかどうかはわかりませんが、このヘッダーを保持して後続のリクエストに追加する方法があれば、正常に機能するはずです。


更新:NTLMは接続を認証するため、Keep-Aliveヘッダーを使用して接続を開いたままにする必要があります。クライアントクラスは、このためのいくつかの設定を提供する必要があります。詳細については、次のページを参照してください。NTLMスキームについて非常に有用で明確です。

http://www.innovation.ch/personal/ronald/ntlm.html

于 2011-08-31T11:55:09.973 に答える
1

少し遅すぎるかもしれませんがUnsafeAuthenticatedConnectionSharing、WebRequestHandler でプロパティを true に設定する必要があります (HttpClientHandler を拡張します)。

このように、HttpClient が他のリクエスト間で認証を「共有」できるようにすることで、接続が維持され、同時に接続が維持されます (ヘッダーを自分で設定しても、手動でこれを行うことはできません)。authPersistNonNTLMKerberos またはauthPersistSingleRequestNTLMのいずれかを使用して、サーバーに適切な永続的な承認も必要であることに注意してください。

于 2018-08-20T13:42:37.950 に答える