C#学习教程:WCFclientusingWS-SecurityUsernameTokenPasswordDigestauthenticationschemehasanerrorwhenusingAxis2Webservice基于Java的Axis2Web服务(不在我的控制范围内)。它即将应用WS-Security,我需要修复.NET客户端。但是,我正在努力提供适当的身份验证。我知道WSE3.0可能会让它变得更容易,但我不想再使用过时的技术了。类似的问题(未回答),包括这个,这个和这个。SOAP消息应如下所示:2010-05-28T12:50:33.675+01:00然而,我的如下所示:2010-06-23T10:31:23.441Z2010-06-23T10:36:23.441ZI客户端侧面看起来像这样:PS请注意所需的SecurityHeaderType参数。那是什么?publicMyAckSendRequest(MyRequestrequest){RemoteServicePortTypeClientclient=newRemoteServicePortTypeClient();client.ClientCredentials.UserName.UserName="JAY";client.ClientCredentials.UserName.Password="AND";//两种不同的Credential类型有什么区别??//client.ClientCredentials.HttpDigest.ClientCredential.UserName="SILENT";//client.ClientCredentials.HttpDigest.ClientCredential.Password="BOB";SecurityHeaderTypesht=newSecurityHeaderType();//sht.Any=???;//我该如何使用它???//sht.AnyAttr=???;//我该如何使用它???//SecurityHeaderType是必填参数returnclient.RemoteServiceOperation_Provider(sht,request);当前的绑定如下:我也尝试过自定义绑定并得到类似的错误:和端点(地址明显改变......):返回的自定义错误如下:0UNEXPECTED2010-06-23T13:28:54Z我读了很多关于自定义标头、标记、绑定的内容,但我的大脑完全糊涂了。任何人都可以建议逐步过程以正确的格式发送消息吗?这似乎是WCF使用自定义令牌的前进方向,但我如何根据需要应用摘要和随机数?欢迎任何帮助。更新我的成功有限。我使用Microsoft.Web.Services3库创建了一个具有正确摘要的UsernameToken。然后,我创建了自己的自定义行为,并在BeforeSendRequest方法中执行了以下操作以注入标头:UsernameToken("USERNAME","PASSWORD",PasswordOption.SendHashed);XmlElementsecurityElement=ut.GetXml(newXmlDocument());MessageHeadermyHeader=MessageHeader.CreateHeader("Security","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",securityElement,false);request.Headers.Add(myHeader);返回Convert.DBNull;我添加了类似这样的行为:CustomBehaviorbehavior=newCustomBehavior("USERNAME","PASSWORD");client.Endpoint.Behaviors.Add(行为);我现在可以看到标头:2010-06-24T16:23:58Z但出现错误:soapenv:ServerWSDoAllReceiver:securityprocessingfailed;嵌套异常是:org.apache.ws.security.WSSecurityException:一般安全错误(WSSecurityEngine:回调提供无密码for:USERNAME)urn:Remote_Provider0UNEXPECTED2010-06-24T17:23:59Z密码节点上似乎缺少Type属性:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"但是,我不确定安全跟踪和日志记录设置是否全面删除了这些节点的属性和内容我尝试在诊断中使用logKnownPii设置日志记录,但安全信息仍然模糊不清。对此有什么想法吗?我可以确认这个对我的问题的更新确实有效:.发送哈希);XmlElementsecurityElement=ut.GetXml(newXmlDocument());MessageHeadermyHeader=MessageHeader.CreateHeader("Security","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",securityElement,false);request.Headers.Add(myHeader);返回Convert.DBNull;}和客户端:CustomBehaviorbehavior=newCustomBehavior("USERNAME","PASSWORD");客户端.Endpoint.Behaviors.Add(行为);错误消息不相关。安全标头使用非常简单的basicHttpBinding:可以在我的博客上找到相关代码示例:http://benpowell.org/supporting-the-ws-i-basic-profile-password-digest-in-a-wcf-客户端代理/这个问题写得很好-非常感谢。参考@Junto的“HowdoIusethis”评论,事实证明服务方法上的SecurityHeader参数可用于添加标头。我在下面举了一个例子。我相信正在发生的事情是SvcUtil.exe工具在尝试读取WS*DTD时正在调试。这在使用“添加服务引用”向导时并不明显。但是从命令行运行svcutil.exe时就很明显了。由于svcutil.exe无法读取WS*DTD,因此SecurityHeader对象没有得到很好的开发。但是Microsoft为您提供了.Any属性。您可以将UsernameToken类序列化到.Any属性中,您的标头将添加到消息中。再次感谢这个很好的问题。如何使用SecurityHeader参数添加UsernameToken安全标头:所需工具:Fiddler2(或类似工具)-如果不检查http标头,您真的无法弄清楚这一点。强制性参考:Microsoft.Web.Services3.dll——您可以从4.0程序集WCF服务调用中引用此2.0框架程序集://服务初始化..._service=newMyService("MyEndpoint",RemoteUri);//等等//调用服务——注意调用GetSecurityHeader()_service.ServiceAction(GetSecurityHeader(),"myParam1");//等//////构建WSE3.0安全标头///privateSecurityHeaderGetSecurityHeader(){SecurityHeaderh=newSecurityHeader();UsernameTokent=newUsernameToken(RemoteLogin,RemotePassword,PasswordOption.SendPlainText);h.Any=newXmlElement[1];h.Any[0]=t.GetXml(newXmlDocument());返回h;App.config:我最近遇到了类似的问题,放弃了寻找非WSE解决方案。经过几天的努力,我最终下载了WSE3.0SDK,使用WseWsdl3.exe生成代理类,并为UsernameToken创建了一个新策略。我在15分钟内启动并运行。以下目前正在为我工??作。以上是C#学习教程:WCF客户端使用WS-SecurityUsernameTokenPasswordDigest认证方案在使用Axis2Web服务时出错。如果对大家有用,需要进一步了解C#学习教程,希望大家多多分享关注——RemoteServiceservice=newRemoteService();//生成类UsernameTokentoken=newUsernameToken(username,password,PasswordOption.SendPlainText);策略policy=newPolicy();policy.Assertions.Add(newUsernameOverTransportAssertion());服务.SetClientCredential(令牌);服务.SetPolicy(政策);varresult=service.MethodCall();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
