C#学习教程:来自C#客户端的ApacheNTLMAuth不适用于自定义NetworkCredentials在域内,我传递了CredentialCache.DefaultNetworkCredentials,所以一切都很好。在域外,用户需要提供用户名、域和密码。这是行不通的。代码的某些部分:CookieContainercookies=newCookieContainer();HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(url);request.Method=WebRequestMethods.Http.Post;request.AllowAutoRedirect=true;request.CookieContainer=cookies;//提供会话cookie来处理web服务的登录控制器的重定向if(isWindowAuthentication)//isWindowAuthentication由配置早些时候设置{if(Common.UserName.Length>0){string[]domainuser;字符串用户名;字符串域;如果(Common.UserName.Contains("@")){domainuser=Common.UserName.Split('@');用户名=域用户[0];域=域用户[1];}else{domainuser=Common.UserName.Split('\');用户名=域用户[1];域=域用户[0];NetworkCredentialnc=newNetworkCredential(用户名,Common.Password,域);CredentialCache缓存=newCredentialCache();cache.Add(request.RequestUri,"NTLM",nc);request.Credentials=缓存;}else{request.Credentials=CredentialCache.DefaultNetworkCredentials;后来我做拉请求request.GetResponse();如果我使用CredentialCache.DefaultNetworkCredentials那么一切正常。当我切换到我自己的新NetworkCredential()部分时,身份验证失败。我检查了Apache的日志(它是带有SSPImod的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%7DHTTP/1.1"302202192.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%257DHTTP/1.1"401401192.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%257DHTTP/1.1"401401192.168.14.9-rausch[25/Oct/2012:315:+03]"GET/ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257DHTTP/1.1"302156你自己的凭据结果是Log2(不起作用):192.168.14.9--[25/Oct/2012:12:05:23+0200]"POST/ror/ioi/start?document%5Bguid%5D=%7B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%7DHTTP/1.1"302202192.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%257DHTTP/1.1"401401我不明白的是当我检查例如CredentialCache.DefaultNetworkCredentials.UserName它是空的任何人都知道该怎么做以及如何设置我自己的凭据以确保身份验证按预期工作?经过大量测试和调查以及堆栈溢出的许多资源我发现发生了什么...theproblemseemstobehandleauthenticationwhenpartsofwebseiterequestcredentialsandsomepartsdon't.背景:我们的网站有自己的会话管理,并在没有有效会话时重定向到登录控制器。OnlyThislogincontrollerissetforNTLMauthentication.这是因为我们有一个没有NTLMauth的网站(在IE中没有401,302请求循环!)并且只验证一次(我们在不同的URL上处理身份验证以防止IE在不可用时停止问题发布具有经过身份验证的站点的数据=>请参阅http://support.microsoft.com/?id=251404)。解决方法:我一般是在目标页面发送请求,web服务器重定向,进行鉴权Authenticate,重定向回目标。由于httpwebrequest出于某种原因无法处理此问题,如果我有自己的一组凭据(有关我的问题,请参见上面的代码),我将代码更改为对登录控制器进行一次身份验证并将会话存储在cookie容器中。对于以下所有要求,我根本不再进行身份验证。我添加了cookie容器,我的服务器得到了一个有效的会话。所以我不必再进行身份验证了。副作用以这种方式表现得更好好吧。另一个关键点是我不仅使用了httpwebrequest,还使用了webform控件。所以我在这里找到了添加我自己的cookie会话的解决方案:UsingcookiesfromCookieContainerinWebBrowser(感谢Aaron也为我省去了很多麻烦)。以上是C#学习教程:C#客户端的ApacheNTLMAuth不能和自定义的NetworkCredentials一起使用。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏不代表立场,如涉及侵权,请点右转联系管理员删除。如需转载请注明出处:
