ios - 为什么我不能使 HttpWebRequest 与 NTLM 身份验证一起使用

标签 ios xamarin.ios exchangewebservices ntlm

我正在尝试从 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/

相关文章:

ios - 构造为 ViewModel

c# - 带负号 (-) 和点号 (.) 的数字键盘

ios - 当其他 View 增大或减小大小时调整 UIView 宽度

java - 使用 EWS 检索超过 1000 个联系人

ios - 从数组中获取随机字符串

iphone - 找不到 'AbstractPickerView' 的接口(interface)声明, 'AttackLayer' 的父类(super class)

ios - 使用 mapkit 信息按钮推送到第二个 View Controller

multithreading - Xamarin.IOS应用程序不断启动和完成许多线程

exchangewebservices - Exchange Web服务-获取所有可用的“ExtendedProperty”的列表

java - 无法建立与 Exchange Web 服务的连接 - Java API