4


0

(WinForms C#アプリから)Webサイトへの基本認証で「新しいNetworkCredential(username、password)」の使用が機能しないのはなぜですか?

基本認証(ユーザー名/パスワード)を使用するWebサイトがあります。

次のコードが機能しないのはなぜですか? 実行すると、Webアプリケーションがログインコントローラーに移動しますが、資格情報を入力しているので、既に認証されているはずです。 つまり、.NETでwinforms HttpWebRequestを確認して、認証プロセスを自動化する方法を確認しようとしています。 NetworkCredentialがこれを行うべき.netクラスであると仮定していますか? または.NETでは、自分で実装しなければならない手動の2ステッププロセスがあると期待されていますか?

これがコードです:

    // Create a new webrequest to the mentioned URL.
    var uri = new Uri("http://10.1.1.102:3000/download/sunset");
    var myWebRequest = (HttpWebRequest)WebRequest.Create(uri);
    myWebRequest.PreAuthenticate=true;
    var networkCredential=new NetworkCredential("test", "asdfasdf");
    myWebRequest.Credentials=networkCredential;
    var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();

    Console.Out.WriteLine("STATUS = " + myWebResponse.StatusCode);

    var stream = myWebResponse.GetResponseStream();
    var reader = new StreamReader(stream);
    string text_read = reader.ReadToEnd();
    Console.WriteLine(text_read);
    DisplayHtml(text_read);
    reader.Close();
    stream.Close();
    myWebResponse.Close();

ありがとう

2 Answer


15


`WebRequest`は、サイトによってチャレンジされない限り、資格情報を送信しません。 サイトは最初に「WWW-Authenticate」ヘッダーで401「Authorization Required」で応答する必要があります。 「WebRequest」は認証情報でチャレンジに応答し、サービスは200のHttpコンテンツで応答する必要があります。

サイトがBasic authを適切に実装していないように聞こえます(仕様では、レルムを渡すために最初にチャレンジする必要があると書かれています)。これは非常に一般的な動作です。 基本認証を `WebRequest.Headers`コレクションに手動で追加できます。これは、ほとんどの開発者がとにかく終了するものです。

HttpWebRequest notpass Credentialsをご覧ください。


2


誰かがサーバー側の修正を探している場合は、追加するだけです

HttpContext.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"MyRealm\"");

StatusCode = 401を設定した後