7

基本認証でWebサービスを使用しています。Web サービスの所有者がバランシング サービスを実装するまで、すべて問題なく機能していました。これは、リクエストを Web サービスの別のインスタンスにリダイレクトするだけです。

問題は、リダイレクトされた後に基本認証が失敗することです。「要求認証資格情報が渡されませんでした」という例外があります。

追加情報:

  1. リクエストを手動で作成する必要があります。

        var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(Settings.Default.HpsmServiceAddress));
    
        req.Headers.Add("Authorization", "Basic aaaaaaaaaaa");
        req.PreAuthenticate = true;
        req.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
        req.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)";
        req.KeepAlive = false;
    
        ServicePointManager.Expect100Continue = false;
    
        req.ContentType = "text/xml; charset=utf-8";
        req.Method = "POST";
        req.Accept = "gzip,deflate";
        req.Headers.Add("SOAPAction", actionName);
        byte[] buffer = Encoding.UTF8.GetBytes(envelop);
        Stream stm = req.GetRequestStream();
        stm.Write(buffer, 0, buffer.Length);
        stm.Close();
    
        WebResponse response = req.GetResponse();
        string strResponse = new StreamReader(response.GetResponseStream()).ReadToEnd();
        response.Dispose();
    
  2. HTTP 307 リダイレクトでリダイレクトされます

4

2 に答える 2

2

HttpWebRequest.AllowAutoRedirect プロパティの MSDN に従ってください。私はこれを見つけました:

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

解決策は、カスタム認証モジュールを作成することです。

ここで私が見つけたもの:

http://msdn.microsoft.com/en-us/library/system.net.authenticationmanager.aspx

そして、ここで AllowAutoRedirect プロパティ ページ:

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowautoredirect.aspx

アップデート

webrequest にヘッダーを追加する代わりに CredentialCache を使用してみてください。

CredentialCache myCache = new CredentialCache();

myCache.Add(
new Uri("http://www.contoso.com/"),"Basic",new NetworkCredential(UserName,SecurelyStoredPassword));
req.Credentials = myCache;
于 2012-12-27T15:22:55.823 に答える