我正在尝试从 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();
最后一行抛出异常:401:未授权。
HttpWebRequest 不应该透明地处理协商,即处理挑战并生成第二个和第三个请求吗?
附言http 和 https 的结果是一样的
附言使用 EWS 托管 API,我已经从模拟器成功调用了 EWS(但不幸的是,它不是为实际设备构建的)。在 Exchange 服务器上使用网络嗅探器证明,在一个托管调用中有三个 HTTP 请求,而上面的代码中只有一个。
最佳答案
原文 NTLM 受 Mono 和扩展 MonoTouch 支持,请参阅:MonoTouch support for accessing Mono.Security.Protocol.Ntlm.NtlmFlags
然而较新的 Negotiate Mono(也不 MonoTouch)不支持在仅 kerberos 的环境中进行身份验证。
尝试更改您的 "Negotiate"
对于 "NTLM"
如果网络允许,它应该使用旧协议(protocol)工作。
关于ios - 为什么我不能使 HttpWebRequest 与 NTLM 身份验证一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392439/