MSDNによると、HttpWebRequest.AllowAutoRedirect
プロパティがtrueの場合、リダイレクトによって認証ヘッダーがクリアされます。HttpWebRequest.AllowAutoRedirectで認証を処理する方法は?
Authorizationヘッダを自動リダイレクトにクリアされ、HttpWebRequestの自動的にリダイレクトされた場所に再認証しようとしている:所与の回避策は、IAuthenticationModuleが認証を処理するために実装することです。実際には、これは、リダイレクトが発生する可能性がある場合、アプリケーションがカスタム認証情報をAuthorizationヘッダーに入れることができないことを意味します。代わりに、アプリケーションはカスタム認証モジュールを実装して登録する必要があります。 System.Net.AuthenticationManagerおよび関連するクラスは、カスタム認証モジュールを実装するために使用されます。 AuthenticationManager.Registerメソッドは、カスタム認証モジュールを登録します。
私は、このインタフェースの基本的な実装を作成しました:私はリダイレクトされません要求を行うと、
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();
}
}
:
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))))));
}
}
と機能を行使するための簡単なドライバを私のクラスのAuthenticate
メソッドが呼び出され、認証が成功します。 307(一時的なリダイレクト)応答を返す要求をすると、クラスのメソッドが呼び出されず、認証が失敗します。何が起きてる?
私は自動リダイレクトを無効にしておらず、3xx応答を自分で処理するためのカスタムロジックを作成しません。自動リダイレクトで認証ロジックを使用するにはどうすればよいですか?
あなたはこれを試すことができます。
次のリソースは(OPで述べた.NETドキュメントの参照とは対照的に)これを確認するように見えましたか?またはリダイレクトURLをリクエストラインに配置しますか?これについて多くのことを知らないでくださいが、おそらく助けます –
FWIW、私はまったく同じ問題を抱えており、解決策を探しています。 – tomo