我们使用NTLM auth从我们的MonoTouch应用程序访问ASP.net Web服务,一切正常。
我们的一位客户使用相同的应用程序,NTLM auth从我们的应用程序失败,但可以在iPad的Safari浏览器中使用。
查看来自客户的数据包流,当我们的应用发送NTLMSSP_CHALLENGE
消息时,服务器不会返回NTLMSSP_NEGOTIATE
。
查看我们的应用NTLMSSP_NEGOTIATE
消息与iPad的Safari相同消息之间的差异
我们的MT应用程序将NTLM标志设置为0xb203
,Safari将其设置为0x88207
。
NegotiateNtlm2Key
在我们的应用中设为0
,在Safari中设为1
我们的应用程序还发送呼叫工作站域和名称字段,而Safari将两者都发送为空。
客户端的服务器是Windows Server 2003,他们也使用Kerberos作为主要的身份验证方案,并使用NTLM。
在NegotiateNtlm2Key
中设置Mono.Security.Protocol.Ntlm.NtlmFlags
标志会有帮助吗?
答案 0 :(得分:4)
NTLMv2会话和NTLMv2身份验证现已在Mono(mono/master commit 45745e5)中实现。
有关不同NTLM版本的说明,请参阅this article。
默认情况下,只要服务器支持,Mono就会使用NTLMv2会话身份验证,然后再回到LM&否则就是NTLM。
可以使用Mono.Security.Protocol.Ntlm.Type3Message.DefaultAuthLevel
中的新Mono.Security.dll
属性配置默认行为(请参阅mcs/class/Mono.Security/Mono.Security.Protocol.Ntlm
中的Type3Message.cs和NtlmAuthLevel.cs)。
这类似于Windows中的Lan Manager Authentication Level。
2013年1月26日更新
Microsoft Server 2008 RC2存在一个问题,即它不接受它在Type 2消息的目标名称(或目标信息块中的域名)中发回的域名。
因此,我们现在使用NetworkCredential
中的域名来允许用户指定所需的域。这也是最初在Type 1消息中发送到服务器的域名。
答案 1 :(得分:1)
只需设置标志?也许但恕我直言,相当不太可能。
该代码库是在2003年编写的(并在2004年更新),我很确定我(作为低级代码的作者)无法访问Windows 2003服务器或启用Kerberos的域那个时候。
所需的更改量,对于后备,可能不会太大(但如果您已经拥有测试环境,我不会打赌5美元;-)我100%肯定Mono项目很乐意接收补丁来实现这一目标。您还可以在http://bugzilla.xamarin.com
处填写错误报告(优先级提升)以询问此功能另一种方法是使用我认为Safari正在使用的iOS API与ASP.NET Web服务进行通信并自行反序列化数据。很难说哪个选项更复杂。