我有一个使用HttpWebRequest连接服务的办公插件。
在一个域中,我传递了CredentialCache.DefaultNetworkCredentials,所以一切都很好。在域外,用户需要提供用户名、域和密码。这个不能用自动取款机。
其中的一部分代码:
CookieContainer cookies = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.AllowAutoRedirect = true;
request.CookieContainer = cookies; // provide session cookie to handle redirects of login controller of the webservice
if (isWindowAuthentication) // isWindowAuthentication is set earlier by config
{
if (Common.UserName.Length > 0)
{
string[] domainuser;
string username;
string domain;
if (Common.UserName.Contains("@"))
{
domainuser = Common.UserName.Split('@');
username = domainuser[0];
domain = domainuser[1];
}
else
{
domainuser = Common.UserName.Split('\\');
username = domainuser[1];
domain = domainuser[0];
}
NetworkCredential nc = new NetworkCredential(username, Common.Password, domain);
CredentialCache cache = new CredentialCache();
cache.Add(request.RequestUri, "NTLM", nc);
request.Credentials = cache;
}
else
{
request.Credentials = CredentialCache.DefaultNetworkCredentials;
}
}稍后,我将执行请求request.GetResponse();。如果我使用CredentialCache.DefaultNetworkCredentials,那么一切都很好。当我切换到我自己的new NetworkCredential()部件时,身份验证失败。
我检查了Apache的日志(它是使用SSPI mod的Apache2.2)。当它成功时,第一个请求重定向到登录控制器,然后登录控制器请求凭据。传递并工作(重定向到目标站点)。
日志1(工作):
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - rausch [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 302 156自己的凭证结果在此处日志2(不起作用):
192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%257D HTTP/1.1" 401 401我不明白的是,当我检查的时候,比如CredentialCache.DefaultNetworkCredentials.UserName是空的。
有谁知道要做什么,以及我必须如何设置自己的凭据,以确保身份验证按预期工作?
发布于 2012-10-30 03:23:38
最后,经过大量的测试和调查,以及许多关于堆栈溢出的资源,我发现了这是怎么回事。
问题似乎是,当网站的某些部分请求凭据时,httpwebrequest不处理身份验证,而有些则不处理。
背景:
我们的站点有自己的会话管理,当没有有效的会话可用时,它会重定向到登录控制器。只有此登录控制器设置为NTLM身份验证。
我们这样做是因为我们的网站根本没有NTLM身份验证(IE中没有401,302个请求循环!)并且只验证一次(我们在不同的url上处理身份验证,以防止IE停止在未经身份验证的站点=>发布数据的问题,请参阅http://support.microsoft.com/?id=251404)。
解决方案:
我通常在我的目标页面上发送一个请求,然后sent服务器重定向、验证并重定向回目标。如果我设置了自己的凭据(参见上面问题的代码),那么httpwebrequest出于任何原因都不会处理此问题,因此我将代码更改为对登录控制器进行一次身份验证,并将会话存储在cookie容器中。
对于下面的所有请求,我都不再验证了。我添加了cookie容器,我的服务器就会得到一个有效的会话。这样我就不必再进行身份验证了。副作用是这种方式更好的性能。
另一件棘手的事情是,我不仅使用httpwebrequest,我还使用webform控件。因此,我找到了在这里添加我自己的cookie会话的解决方案:Use cookies from CookieContainer in WebBrowser (感谢Aaron,他也为我省去了很多麻烦)。
https://stackoverflow.com/questions/13066270
复制相似问题