HTTPWebRequest
を使用してRESTサービスにアクセスしようとしていますが、クレデンシャルを渡すのに問題があります。以下のコードを参照してください。NetworkCredential
SSLをサポートしていないため、HTTPSサイトにアクセスしていますが、SSLをサポートするNetworkCredential
に似たクラスを知っている人はいますか?
Uri requestUri = null;
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
NetworkCredential nc = new NetworkCredential("user", "password");
request.Credentials = nc;
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
サーバーがNTLM認証を使用している場合、これを試すことができます。
CredentialCache cc = new CredentialCache();
cc.Add(
new Uri("https://mywebserver/webpage"),
"NTLM",
new NetworkCredential("user", "password"));
request.Credentials = cc;
昔ながらの方法を使用したときに表示されるかどうかを確認します。
string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
Webサービスを保護しているのはどのような認証メカニズムですか? HttpWebRequest
に設定されたクレデンシャルは、HTTPのAuthorization
ヘッダーを介して Basic 、 Digest または [〜#〜 ] ntlm [〜#〜] 。したがって、WebサービスがWS-Security
で保護されている場合、WS-Security
はHTTPレベルで動作しないため、NetworkCredentials
はおそらく認証スキームにまったく渡されません。
行うべきことは、コマンドラインツールwsdl.exe
または同様のものを使用して、WebサービスのWebサービスクライアントプロキシを作成することです。これにより、Webサービス対応の認証スキームにアクセスできます。
コメント後に更新:
SSLで適切に認証するには、HttpWebRequest
がWWW-Authenticate
チャレンジを401 Unauthorized
で受信する必要があるようです。 HttpWebRequests
には、通常のHTTPトラフィックと暗号化されたHTTPSトラフィックを処理する2つの別個のコードパスがあると思います。とにかく、あなたが試すべきことは:
https://.../
URIに対して認証されていないHttpWebRequest
を実行します。401 Unauthorized
応答を受信します。Credentials
を設定して同じ要求を実行します(PreAuthenticate
がtrue
であるかfalse
であるかは不明です;両方をテストします)。200 OK
またはWebサービスが応答するものを取得できます。別のオプションは、最初のリクエストでAuthorization
ヘッダーを自分で構築することです:
string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);
Request.PreAuthenticateをtrueに設定してみてください。