12

MSDNによると、HttpWebRequest.AllowAutoRedirectプロパティが true の場合、リダイレクトによって認証ヘッダーがクリアされます。与えられた回避策は、認証を処理するために IAuthenticationModule を実装することです。

Authorization ヘッダーは自動リダイレクトでクリアされ、HttpWebRequest はリダイレクトされた場所への再認証を自動的に試みます。実際には、これは、リダイレクトが発生する可能性がある場合、アプリケーションがカスタム認証情報を Authorization ヘッダーに入れることができないことを意味します。代わりに、アプリケーションはカスタム認証モジュールを実装して登録する必要があります。System.Net.AuthenticationManager および関連するクラスは、カスタム認証モジュールを実装するために使用されます。AuthenticationManager.Register メソッドは、カスタム認証モジュールを登録します。

このインターフェースの基本的な実装を作成しました。

public class CustomBasic : IAuthenticationModule
{
    public CustomBasic() { }

    public string AuthenticationType { get { return "Basic"; } }

    public bool CanPreAuthenticate { get { return true; } }

    private bool checkChallenge(string challenge, string domain)
    {
        if (challenge.IndexOf("Basic", StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
        if (!string.IsNullOrEmpty(domain) && challenge.IndexOf(domain, StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
        return true;
    }

    public Authorization PreAuthenticate(WebRequest request, ICredentials credentials)
    {
        return authenticate(request, credentials);
    }

    public Authorization Authenticate(String challenge, WebRequest request, ICredentials credentials)
    {
        if (!checkChallenge(challenge, string.Empty)) { return null; }
        return this.authenticate(request, credentials);
    }

    private Authorization authenticate(WebRequest webRequest, ICredentials credentials)
    {
        NetworkCredential requestCredentials = credentials.GetCredential(webRequest.RequestUri, this.AuthenticationType);
        return (new Authorization(string.Format("{0} {1}", this.AuthenticationType, Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", requestCredentials.UserName, requestCredentials.Password))))));
    }
}

および機能を実行するための単純なドライバー:

public class Program
{
    static void Main(string[] args)
    {
        // replaces the existing handler for Basic authentication
        AuthenticationManager.Register(new CustomBasic());
        // make a request that requires authentication
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.SomeUrlThatRequiresAuthentication.com");
        request.Method = "GET";
        request.KeepAlive = false;
        request.ContentType = "text/plain";
        request.AllowAutoRedirect = true;
        request.Credentials = new NetworkCredential("userName", "password");
        HttpWebResponse result = (HttpWebResponse)request.GetResponse();
    }
}

リダイレクトしないリクエストを行うAuthenticateと、クラスのメソッドが呼び出され、認証が成功します。307 (一時リダイレクト) 応答を返す要求を行うと、クラスのメソッドが呼び出されず、認証が失敗します。何が起きてる?

自動リダイレクトを無効にして、自分で 3xx 応答を処理するカスタム ロジックを記述したくありません。認証ロジックを自動リダイレクトで動作させるにはどうすればよいですか?

4

4 に答える 4

0

OPは非常に古いですが、クレーターの回答をTHE ANSWERとして指名します. 私がアクセスしていた Web リソースは基本認証のみを使用していましたが、カスタム認証モジュールを作成するなど、同様の回転を経験しました。私が見つけたのは、単純な NetworkCredential の代わりに CredentialCache を使用した後にのみ、認証モジュールがリダイレクト後に呼び出されたことです。

さらに、必要な認証は Basic だったので、CredentialCache を提供するだけで、カスタム認証モジュールはまったく必要ないことがわかりました。標準の Basic モジュールは問題なく機能しました。

次のリソースはこれを確認しているようです(OPで言及されている.NETドキュメントの参照とは対照的に):

https://blogs.msdn.microsoft.com/ncl/2009/05/05/custom-http-authentication-schemes/

于 2016-09-19T13:21:58.963 に答える
0

以下が、コード プロジェクトの URL http://www.codeproject.com/Articles/49243/Handling-Cookies-with-Redirects-and-HttpWebRequestから取得した別のオプションになることを願っています

    String targetUrl = "https://www.SomeUrlThatRequiresAuthentication.com";

    HttpWebRequest request = GetNewRequest(targetUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    while (response.StatusCode ==  HttpStatusCode.MovedPermanently)
    {
        response.Close();
        request = GetNewRequest(response.Headers["Location"]);
        response = (HttpWebResponse)request.GetResponse();
    }


private static HttpWebRequest GetNewRequest(string targetUrl)
{

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUrl);
    request.AllowAutoRedirect = false;
    request.Headers.Add("Authorization", "Basic xxxxxxxx");
    return request;
}
于 2015-11-10T17:08:49.767 に答える
-3

あなたがする必要があるのは、おそらくPOSTリクエストです。POST認証する変数を投稿しているため、アクションを使用する必要があります。

詳細については、この投稿を参照してください: C# 経由で Web サイトにログイン

自動リダイレクトがこの投稿リクエストの邪魔になるべきではありません。Fiddler をインストールして手動でログインし、何が起こるかを確認することをお勧めします。

POSTリクエストを送信する際、ログインフォームがある場合は、フォーム内のタグにPOSTリクエストを送信していることに注意してください。それにデータを送信すると、問題なくログインできるはずです。action='/some-url-or-whatever.php'POST

これが役立つかどうか教えてください。

于 2015-06-16T19:09:30.673 に答える