为什么我不能使HttpWebRequest使用NTLM身份validation
我正在尝试从MonoTouch中调用EWS,如下面的代码片段所示:
byte[] bytes = Encoding.UTF8.GetBytes("... some xml here ..."); HttpWebRequest req = WebRequest.Create("https://owa.site.com/ews/exchange.asmx") as HttpWebRequest; req.Method = "POST"; req.KeepAlive = true; req.ContentType = "text/xml"; req.ContentLength = bytes.Length; req.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested; CredentialCache ch = new CredentialCache(); ch.Add(req.RequestUri, "Negotiate", new NetworkCredential("uname", "pwd", "domain")); req.Credentials = ch; Stream sreq = req.GetRequestStream(); sreq.Write(bytes, 0, bytes.Length); sreq.Close(); WebResponse resp = req.GetResponse();
最后一行出现exception:401:未授权。
HttpWebRequest是否应该透明地处理协商,即处理挑战并生成第二个和第三个请求?
PS结果与http和https相同
PPS使用EWS托pipeAPI,我已经从模拟器成功的EWS调用(但不幸的是,它不是为实际设备build立)。 在Exchange服务器上使用networking嗅探器certificate在单个托pipe调用中有三个HTTP请求,并且只有一个来自上面的代码。
原始NTLM由Mono和MonoTouch支持 ,请参阅: MonoTouch支持访问Mono.Security.Protocol.Ntlm.NtlmFlags
然而,Mono(也不是MonoTouch)不支持允许在仅kerberos环境中进行身份validation的较新协商 。
尝试更改"Negotiate"
为"NTLM"
,它应该,如果networking允许,使用旧的协议工作。