保持HTTP基本认证方式活着,而被重定向(Keeping HTTP Basic Authentifi

2019-07-17 15:37发布

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

Answer 1:

遵循HttpWebRequest.AllowAutoRedirect物业我发现这个MSDN:

该授权头在自动重定向清除 ,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

UPDATE

你可以尝试使用CredentialCache而不是附加头的WebRequest?

CredentialCache myCache = new CredentialCache();

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


Answer 2:

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

我希望这将帮助别人的未来。



文章来源: Keeping HTTP Basic Authentification alive while being redirected