重定向时保持HTTP基本身份验证活动

时间:2012-12-27 15:07:29

标签: c# web-services http http-headers basic-authentication

我们正在使用基本身份验证的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重定向重定向

2 个答案:

答案 0 :(得分:2)

按照MSDN for HttpWebRequest.AllowAutoRedirect Property我发现了这个:

  

自动重定向时清除授权标头和   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

更新

您可以尝试使用CredentialCache而不是向webrequest添加标头吗?

CredentialCache myCache = new CredentialCache();

myCache.Add(
new Uri("http://www.contoso.com/"),"Basic",new NetworkCredential(UserName,SecurelyStoredPassword));
req.Credentials = myCache;

答案 1 :(得分:0)

实际上,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);
    }
}

我希望它将对将来的人有所帮助。