Web服务请求身份validation

我们真的被困在这里,所以我决定请你帮忙。

昨天我被要求帮助使用Web服务,获取WSDL的URL以及要使用的用户凭据。 我从来没有真正与网络服务有任何关系,但对他们有一个大致的想法,并看到一些例子,我认为它不会那么糟糕。 显然我错了,因为我现在被困住了。

一切似乎都很好,代理类(或客户端)已生成,构建请求并发送它们也很好,除了身份validation部分。 我们似乎无法弄明白该怎么做。

使用:

client.ChannelFactory.Credentials.UserName.UserName = "myusername"; client.ChannelFactory.Credentials.UserName.Password = "mypassword"; 

似乎没有用。 (当我检查由client.Endpoint.Binding.CreateBindingElements()返回的BindingElementCollection时,没有SecurityBindingElement)

我已经尝试了很多其他方法,但我认为我缺少一些基本的东西,缺乏文档也没有真正帮助。

所以问题是:如何使用WCF调用Web服务时发送用户名和密码?

编辑:只是为了澄清,请求应包含类似于此的内容:

    username 1DiaGTkOLk/CZhDaEpbkAaKRfGw= 6ApOnLn5Aq9KSH46pzzcZA== 2009-05-13T18:59:23.309Z   

我有同样的问题。 我使用MessageInspectorBeforeSendRequest方法中添加正确的UsernameToken ,而不是自定义标记序列化BeforeSendRequest 。 然后我使用自定义行为来应用修复。

在我的博客文章中支持WCF客户端代理中的WS-I基本配置文件密码摘要,记录整个过程(带有演示项目 )。 或者,您只需阅读PDF即可 。

如果您想跟进我的进展到解决方案,您将在StackOverflow上找到它,标题为“ WCF客户端使用WS-Security UsernameToken PasswordDigest身份validation方案消耗Axis 2 Web服务时出错 ”:

我使用常规的HttpCookie取得了类似的成就。

要创建cookie:

 [OperationContract] public void LoginToApi(string username, string password, string clientName) { // authenticate with DB, if successful ... // construct a cookie HttpCookie httpCookie = new HttpCookie("SessionID","whateverneeded"); HttpContext.Current.Response.SetCookie(httpCookie); } 

这也出现在您的常规HttpRequests中。 所以你只需要反转这个过程,检查哈希/会话ID /用户名/密码,无论你在收到cookie之前放入什么,都要做任何事情。

 var factory = new ChannelFactory('*'); factory.Credentials.UserName.UserName = 'bob'; factory.Credentials.UserName.Password = 'bob'; var proxy = factory.CreateChannel(); 

有关更多信息,您可以浏览基于WCF的服务中的授权*( http://msdn.microsoft.com/en-us/magazine/cc948343.aspx )*