我们真的被困在这里,所以我决定请你帮忙。
昨天我被要求帮助使用Web服务,获取WSDL的URL以及要使用的用户凭据。 我从来没有真正与Web服务有任何关系,但对它们有一个大概的想法并看到一些例子,我认为它不会那么糟糕。显然我错了,因为我现在被困住了。
一切似乎都很好,代理类(或客户端)已经生成,构建请求并发送它们也很好,除了身份验证部分。我们似乎无法弄明白该怎么做。
使用:
client.ChannelFactory.Credentials.UserName.UserName = "myusername";
client.ChannelFactory.Credentials.UserName.Password = "mypassword";
似乎不起作用。 (当我检查由client.Endpoint.Binding.CreateBindingElements()返回的BindingElementCollection时,没有SecurityBindingElement)
我已经尝试了很多其他方法,但我认为我缺少一些基本的东西,缺乏文档也没有真正帮助。
所以问题是:如何使用WCF调用Web服务时发送用户名和密码?
修改 只是为了澄清,请求应该包含类似的内容:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-25763165">
<wsse:Username>username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">1DiaGTkOLk/CZhDaEpbkAaKRfGw=</wsse:Password>
<wsse:Nonce>6ApOnLn5Aq9KSH46pzzcZA==</wsse:Nonce>
<wsu:Created>2009-05-13T18:59:23.309Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
答案 0 :(得分:6)
我遇到了同样的问题。我使用MessageInspector
代替自定义令牌序列化程序,在UsernameToken
方法中添加了正确的BeforeSendRequest
。然后我使用自定义行为来应用修复。
我的博文demo project中记录了整个过程(Supporting the WS-I Basic Profile Password Digest in a WCF client proxy}。或者,您可以阅读PDF。
如果您想跟进我的进度到解决方案,您可以在StackOverflow上找到标题为“Error in WCF client consuming Axis 2 web service with WS-Security UsernameToken PasswordDigest authentication scheme”:
答案 1 :(得分:1)
我使用常规的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之前放入什么内容。
答案 2 :(得分:1)
var factory = new ChannelFactory<IService>('*');
factory.Credentials.UserName.UserName = 'bob';
factory.Credentials.UserName.Password = 'bob';
var proxy = factory.CreateChannel();
有关详细信息,您可以浏览基于WCF的服务中的授权*(http ://msdn.microsoft.com/en-us/magazine/cc948343.aspx)*