HTTP認証に関する基本的な質問があります
1)クライアントはHTTPのサーバーの認証タイプ(基本/ダイジェスト/ NTLM)をどのように知っていますか?
これはHTTPサーバー側で構成できますか?
私の回答:サーバーは、クライアントに対して実行する必要のある認証タイプで設定されます。したがって、クライアントAPI(C#HttpWebRequest API内)が自動的に処理します。HTTPフィルターを適用したWireshrkの最適な使用法。インターネットプロトコル層で送信元IPと宛先IPを取得します。そして、http層の伝送制御プロトコルとathenticationタイプのsrcとdestポート。
2)クライアントとサーバーの間にsquidlinuxプロキシを配置した場合。クライアントコードからプロキシの認証タイプについても知っておく必要がありますか?または認証タイプはエンドHTTPサーバーにのみ関連していますか?
私の答え: squidプロキシがクライアントとサーバーの間に配置されている場合。HTTP認証を使用しません。a)DB:SQLデータベースを使用します。b)LDAP:ライトウェイトディレクトリアクセスプロトコルを使用します。c)RADIUS:ログイン検証にRADIUSサーバーを使用します。など。したがって、HTTPヘッダーでプロキシ認証クレデンシャルについて言及する必要があります。
3)WireSharkを使用すると、単一の要求を満たすためにブラウザーからサーバーへの要求が3つあることがわかりました。
a)ブラウザは認証資格情報なしでリクエストを送信します。そのため、サーバーはrelamとnonceとともに401で応答しました。
WWW-Authenticate: Digest realm="realm", qop="auth", nonce="MTM1OTYyMzkyNDU4MzpiOWM0OWY0NmMzMzZlMThkMDJhMzRhYmU5NjgwNjkxYQ=="\r\n <BR>
b)ブラウザが2回目に、クレデンシャル、relam、nonce、cnonceを使用してリクエストを送信する。しかし、それでもサーバーは401で応答しました。
WWW-Authenticate: Digest realm="realm", qop="auth", nonce="MTM1OTYyMzk0OTAyMTo3Njk3MDNhZTllZDQyYzQ5MGUxYzI5MWY2MGU5ZDg0Yw==", stale="true"\r\n
c)3回目のブラウザは、同じクレデンシャル、relam、nonce、cnonceを使用して同じリクエストを送信します。今回、サーバーは200okを送信します。
私の質問は、ブラウザが同じリクエストを送信する2回目と3回目です。サーバーが2回目に失敗し、3回目に成功した理由。これは私のサーバーの実装によるものですか?(私はSPRINGセキュリティフィルターを備えたREST Javaサーバーを持っています)。
私はC#HTTPクライアントを持っています。
System.Net.NetworkCredentialsが設定されているにもかかわらず、初めてHttpWebRequestが資格情報なしで送信される場合。だからクリネットはリラムとナンスで407を得ました。
2回目のHttpWebRequestは成功です。ブラウザのようなこのクライアントからの3番目の要求はありません。
ブラウザとC#クライアントのこの違いはなぜですか?
私の答え:私はまだここで何が起こっているのかわかりません:Q3。
4)私が直面している本当の問題は、SQUID LINUXPROXYがクライアントとHTTPサーバーの間に侵入したときに、ブラウザーが同じ3つの要求認証を実行して成功したことです。ただし、C#HttpWebRequestは2番目の要求で失敗(401)され、cache(exception){}ブロックに到達し、3回目の試行は行われませんでした。
プロキシサーバーが間にあるときにC#クライアントでこの問題を解決する方法を誰かに明確にしていただけませんか?
以下のコードはGETリクエストを実行しています。
HttpWebRequest request = WebRequest.Create("url") as HttpWebRequest;
request.Credentials = new NetworkCredential(loginUserName, password);
WebResponse response = request.GetResponse();
プロキシへのリクエストは、HTTPプロトコルではなくTCPプロトコルを介して送信されることに注意してください。次に、PROXYからSERVERにHTTPプロトコルで通信します。ただし、プロキシからのHTTPリクエストでは、HTTPヘッダーにクライアントIPに関する情報が含まれていますX-Forwarded-For
。
以下は可能な解決策です
これらのソリューションは、プロキシが認証を必要とする場合にのみ必要であり、それ以外の場合は無視します。
解決策1:私のために働く
request.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
解決策2:解決策2:
IWebProxy proxy = WebRequest.GetSystemWebProxy();
proxy.Credentials = new NetworkCredential(UserName, UserPassword, UserDomain);
request.Proxy = proxy;
マーティンによって与えられた解決策3:
var proxy = new WebProxy ("http://localhost:3128/");
proxy.Credentials = new NetworkCredential (UserName, UserPassword, UserDomain);
request.Proxy = proxy;
プロキシ認証の詳細については、 http: //wiki.squid-cache.org/Features/Authenticationをご覧ください。