基本認証を使用したHttpWebRequest


137

この動作用にIISをセットアップするときによく使用される「基本的な認証リクエスト」を模倣した認証リクエストを実行しようとしています。

URLは次のとおり です:https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST =2
(警告:https!)

このサーバーは、アプリケーションサーバーとしてUNIXおよびJavaの下で実行されています。

これは、このサーバーに接続するために使用するコードです。

CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");
request.Credentials = new NetworkCredential(xxx,xxx);
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

(私はこれをこのサイトの別の投稿からコピーしました)。しかし、私はサーバーからこの回答を受け取ります:

基になる接続が閉じられました:送信で予期しないエラーが発生しました。

私はC#に関する私の知識が私に提供する必要があるすべての可能なタスクを試したと思いますが、何も...


あなたが追加した場合、これはうまくいったと思います:request.UseDefaultCredentials = false;
bpeikes

回答:


273

承認ヘッダーを自分で追加することもできます。

名前を「Authorization」、値を「Basic BASE64({USERNAME:PASSWORD})」にするだけです。

String username = "abc";
String password = "123";
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);

編集する

HTTP基本認証にどのエンコーディングを使用する必要があるかに従って、エンコーディングをUTF-8からISO 8859-1に切り替えましたとJeroenのコメント。


3
では、UTF8が使用に適したエンコーディングであることをどのようにして確認できますか?
Jeroen Wiert Pluimers 2014

2
ナイスキャッチ。リクエスト認証ヘッダーはISO-8859-1でエンコードする必要があるようです。stackoverflow.com/questions/7242316/…
Zambonilli '21

1
ああ!1:ありがとう、仲間。2. CredentialCacheで認証方法を設定する他の方法がまったく機能しない理由を本当に知りたいのですが。彼らはそうであるね?
mshthn 2017

1
すべてのmsdnドキュメントはyesを指しています。他の方法が機能するはずです。しかし、私は彼らを働かせることはできませんでした。
サンボニーリ2017

私にとっては機能しません(utf-8でもISO-8859-1でもありません)。チェックすべき提案はありますか?「webRequest.Credentials = new NetworkCredential(UserID、Password);」を実行すると機能します 。
RollerCosta

56

やっとできた!

string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
WebRequest request = WebRequest.Create(url);
request.Credentials = GetCredential();
request.PreAuthenticate = true;

そしてこれは GetCredential()

private CredentialCache GetCredential()
{
    string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential(ConfigurationManager.AppSettings["ead_username"], ConfigurationManager.AppSettings["ead_password"]));
    return credentialCache;
}

わーい!


29

WebClientクラスを使用できる場合、基本認証の使用は簡単になります。

var client = new WebClient {Credentials = new NetworkCredential("user_name", "password")};
var response = client.DownloadString("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");

8

これを試して:

System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); 
credentialCache.Add(
    new System.Uri("http://www.yoururl.com/"),
    "Basic", 
    new System.Net.NetworkCredential("username", "password")
);

...
...

httpWebRequest.Credentials = credentialCache; 

間違いなく基本的な認証ですか?また、ブラウザ経由でユーザー名/パスワードを使用してリソースにアクセスできますか?
MrEyes、

https経由の基本認証のようです。私が提供したリンクをクリックすると、IISで「基本認証」を行ったときや、Apache経由でフォルダーの.htaccssファイルを使用したときと同じように、ブラウザーはユーザー名/パスワード」リクエストをポップアップします。フィドラーを使用しようとしましたが、私は約見当もつかない。
ケニーRullo

WebサイトがIBM httpサーバーで実行されていることを知りました。これは役に立つニュースでしょうか?
Kenny Rullo 2010

5

RestSharpを使用している場合、SimpleAuthenticatorを使用すると失敗する可能性があります(おそらく舞台裏でISO-8859-1を使用していないため)。私は基本認証ヘッダーを明示的に送信することでそれを成し遂げました:

string username = "...";
string password = "...";

public IRestResponse GetResponse(string url, Method method = Method.GET)
{
    string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}"));
    var client = new RestClient(url);
    var request = new RestRequest(method );
    request.AddHeader("Authorization", $"Basic {encoded}");
    IRestResponse response = client.Execute(request);
    return response;
}

var response = GetResponse(url);
txtResult.Text = response.Content;

3

基本認証とプロキシが実装されている場合、次のコードはJSON応答を解決します。IIS7.5 Hosting Problmも解決します。

public string HttpGetByWebRequ(string uri, string username, string password)
{
//For Basic Authentication
    string authInfo = username + ":" + password;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

//For Proxy
    WebProxy proxy = new WebProxy("http://10.127.0.1:8080", true);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "GET";
    request.Accept = "application/json; charset=utf-8";
    request.Proxy = proxy;

    request.Headers["Authorization"] = "Basic " + authInfo;

    var response = (HttpWebResponse)request.GetResponse();

    string strResponse = "";
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        strResponse= sr.ReadToEnd();

    }

    return strResponse;
}

私にとっては機能しません(utf-8もISO-8859-1もデフォルトもありません)。確認すべき提案はありますか?ご注意ください-「webRequest.Credentials = new NetworkCredential(UserID、Password);」を実行すると機能します
RollerCosta


1

次の構造は私にとって正しく機能していませんでした:

request.Credentials = new NetworkCredential("user", "pass");

CredentialCache代わりに使用しました:

CredentialCache credentialCache = new CredentialCache
{
    {
        new Uri($"http://{request.Host}/"), "Basic",
        new NetworkCredential("user", "pass")
    }
};
request.Credentials = credentialCache;

ただし、複数の基本認証資格情報を追加する場合(たとえば、知っているリダイレクトがある場合)、私が作成した次の関数を使用できます。

private void SetNetworkCredential(Uri uriPrefix, string authType, NetworkCredential credential)
{
    if (request.Credentials == null)
    {
        request.Credentials = new CredentialCache();
    }

    if (request.Credentials.GetCredential(uriPrefix, authType) == null)
    {
        (request.Credentials as CredentialCache).Add(uriPrefix, authType, credential);
    }
}

それが将来誰かを助けることを願っています。


0

まず、私にとっては、ServicePointManager.SecurityProtocol = SecurityProtocolTypeです。Tls12代わりにTls12が機能しました。

次に、いくつかのデータ(form-urlencoded)と共にBasic Authリクエストを送信する必要がありました。これは、多くの解決策を試した後、私にとって完璧に機能した完全なサンプルです。

免責事項:以下のコードは、このリンクと他のいくつかのスタックオーバーフローリンクで見つかった解決策の組み合わせです。役立つ情報をありがとうございます。

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        String username = "user_name";
        String password = "password";
        String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));

        //Form Data
        var formData = "var1=val1&var2=val2";
        var encodedFormData = Encoding.ASCII.GetBytes(formData);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("THE_URL");
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = "POST";
        request.ContentLength = encodedFormData.Length;
        request.Headers.Add("Authorization", "Basic " + encoded);
        request.PreAuthenticate = true;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(encodedFormData, 0, encodedFormData.Length);
        }

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.