53

HTTP-POST を使用してデータを要求および取得する Web サービスを統合しています。リモート サーバーには、RFC 2617 に従って基本認証が必要です。

認証の試みが失敗しています。

「NetworkCredential」オブジェクトを「HttpWebRequest」オブジェクトの「Credentials」プロパティにアタッチしても、「PreAuthenticate」= true に設定してもヘッダーに認証情報が送信されないという点で失敗します。

私は何が欠けていますか?

//使用されるチャンク

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

Uri uri = new Uri("http://address of services");

ICredentials credentials = netCredential.GetCredential(uri, "Basic");

objRegistration.Credentials = credentials;

objRegistration.PreAuthenticate = true;
4

4 に答える 4

117

必要なことを正確に実行するための、この非常に便利な小さなコードのチャンクを見つけました。サーバーのチャレンジを待たずに、手動で認証ヘッダーをコードに追加します。

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}

このように使用してください

var request = WebRequest.Create("http://myserver.com/service");
SetBasicAuthHeader(request, userName, password);

var response = request.GetResponse();
于 2010-07-16T15:32:28.520 に答える
8

サミュエル・ジャックの受け入れられた答えを少し改善します。この回答で述べられているように、デフォルトのエンコーディング「ISO-8859-1」を使用する代わりに、どのエンコーディングを HTTP 基本認証に使用する必要がありますか?

したがって、コードは次のようになります。

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}
于 2015-12-17T16:54:07.470 に答える
4

答えを探しているときにこの質問を見つけました。与えられた答えは機能しますが、柔軟性がないため、より良い.NETの方法が必要な場合.

Uri uri = new Uri("http://address of services");

HttpWebRequest objRegistration = (HttpWebRequest)WebRequest.Create(url);

CredentialCache credentials = new CredentialCache(); 

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

credentials.Add(uri, "Basic", netCredential);

objRegistration.Credentials = credentials;

「基本」を「ダイジェスト」、「NTLM」、または「ネゴシエート」に置き換えることができます。これにより、キャッシュに複数のタイプを追加することもできます。

于 2015-05-07T12:16:54.397 に答える
3

これが私のOAuthのソリューションです。値は変数 json にあります。

var myUri = new Uri(fullpath);
var myWebRequest = WebRequest.Create(myUri);
var myHttpWebRequest = (HttpWebRequest)myWebRequest;
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken);
myHttpWebRequest.Accept = "application/json";

var myWebResponse = myWebRequest.GetResponse();
var responseStream = myWebResponse.GetResponseStream();
if (responseStream == null) return null;

var myStreamReader = new StreamReader(responseStream, Encoding.Default);
var json = myStreamReader.ReadToEnd();

responseStream.Close();
myWebResponse.Close();
于 2015-02-08T01:36:28.937 に答える