web-dev-qa-db-ja.com

HttpWebRequestが資格情報を渡さない

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();
32
Russ Clark

サーバーがNTLM認証を使用している場合、これを試すことができます。

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;
21
Darin Dimitrov

昔ながらの方法を使用したときに表示されるかどうかを確認します。

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
48
Ed Power

Webサービスを保護しているのはどのような認証メカニズムですか? HttpWebRequestに設定されたクレデンシャルは、HTTPのAuthorizationヘッダーを介して BasicDigest または [〜#〜 ] ntlm [〜#〜] 。したがって、WebサービスがWS-Securityで保護されている場合、WS-SecurityはHTTPレベルで動作しないため、NetworkCredentialsはおそらく認証スキームにまったく渡されません。

行うべきことは、コマンドラインツールwsdl.exeまたは同様のものを使用して、WebサービスのWebサービスクライアントプロキシを作成することです。これにより、Webサービス対応の認証スキームにアクセスできます。

コメント後に更新:

SSLで適切に認証するには、HttpWebRequestWWW-Authenticateチャレンジを401 Unauthorizedで受信する必要があるようです。 HttpWebRequestsには、通常のHTTPトラフィックと暗号化されたHTTPSトラフィックを処理する2つの別個のコードパスがあると思います。とにかく、あなたが試すべきことは:

  1. https://.../ URIに対して認証されていないHttpWebRequestを実行します。
  2. 401 Unauthorized応答を受信します。
  3. 両方のCredentialsを設定して同じ要求を実行します(PreAuthenticatetrueであるかfalseであるかは不明です;両方をテストします)。
  4. これで、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);
26

Request.PreAuthenticateをtrueに設定してみてください。

3
David