我们正在使用具有基本身份验证的网络服务。
一切都很顺利,直到 Web 服务的所有者实施了平衡服务。
这只是将请求重定向到 Web 服务的不同实例。
问题是重定向后基本身份验证失败。
存在“请求身份验证凭据未通过”异常。
附加信息:
-
我们必须手动创建请求。
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();
我们通过 HTTP 307 重定向进行重定向
按照 MSDN 的 HttpWebRequest.AllowAutoRedirect 属性我发现了这个:
自动重定向时会清除授权标头和
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)