在MonoTouch中使用带有身份验证的WCF服务

时间:2011-07-12 08:01:25

标签: c# wcf xamarin.ios wcf-security wcf-client

我正在使用由slsvcutil表单生成的WCF服务客户端Silverlight工具包版本4.我也尝试过版本3同样的问题。当我使用在没有用户凭据的情况下在http上运行的客户端实例时,它运行没有问题。但我需要切换到https以用于高效的服务器并发送为我的应用程序硬编码的用户凭据。我使用以下代码:

        var binding = new BasicHttpBinding (BasicHttpSecurityMode.TransportCredentialOnly);         
        var endpoint = new EndpointAddress (AppSettings.FlareEndPoint);
        _service = new TopicAnalystAPIClient(binding, endpoint);
        _service.ClientCredentials.UserName.UserName = "xxx";
        _service.ClientCredentials.UserName.Password =  "xxx";

当我在该服务上调用一个指向http而无需身份验证的方法时,它可以工作。当我使用此代码对抗http / https与凭证我得到“处理Web请求时出错:状态代码401(未授权):未经授权的”异常。我已经检查过凭据是否正确,我可以在浏览器中打开服务引用。我还尝试了几种http / https和SecurityMode值的组合。我也在四个不同的服务器上尝试过,总是有相同的结果。

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

很多排列都是可能的。 BasicHttpSecurityMode.TransportCredentialOnly应该可以在没有SSL [1]的情况下使用HTTP本身。这意味着服务器将向客户端发送一种(或多种)身份验证方法(例如basic,digest,ntlm),而Mono(包括MonoTouch)应该为大多数人提供支持。

链接器(如果使用)可能会删除其中一个。在这种情况下,您可以尝试构建和测试而无需链接(或跳过System.Net.dll的链接)。

也可能不支持服务所坚持的身份验证方法。您可以通过运行网络跟踪(例如wireshark)找到使用哪一个,或者,它可能会在服务器日志中显示更多详细信息(以及401错误)。

[1] http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpsecuritymode%28v=vs.95%29.aspx