当前位置: 首页 > 编程语言 > C#

如何将标头中的用户名-密码传递给SOAP WCF服务分享

时间:2023-04-11 03:01:11 C#

C#学习教程:Howtopassusername/passwordinheadertoSOAPWCFservice.com/identity-proofing/services/identityProofingServiceWS/v2?wsdl我已将其添加为服务参考,但我不确定如何在标头中传递凭据。如何使标头请求匹配此格式?12345/userIDpassword123d+VxCZX1cH/ieMkKEr/ofA==2012-08-04T20:25:04.038Z可能有更聪明的方法,但您可以像这样手动添加标头:varclient=newIdentityProofingService.IdentityProofingWSClient();使用(newOperationContextScope(client.InnerChannel)){OperationContext.Current.OutgoingMessageHeaders.Add(newSecurityHeader("UsernameToken-49","12345/userID","password123"));client.invokeIdentityService(newIdentityProofingRequest());在这里,SecurityHeader是一个自定义实现的类,因为我选择使用属性来配置XML序列化,所以还需要一些其他类:publicSecurityHeader(stringid,stringusername,stringpassword){_usernameToken=newUsernameToken(id,username,password);}publicoverridestringName{get{return"Security";}}publicoverridestringNamespace{get{return"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";}}受保护的覆盖voidOnWriteHeaderContents(XmlDictionaryWriterwriter,MessageVersionmessageVersion){XmlSerializerserializer=newXmlSerializer(typeof(UsernameToken));serializer.Serialize(writer,_usernameToken);}}[XmlRoot(Namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]publicclassUsernameToken{publicUsernameToken(){}publicUsernameToken(stringid,stringusername,stringpassword){Id=id;用户名=用户名;密码=新密码(){值=密码};}[XmlAttribute(Namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]publicstringId{get;放;}[XmlElement]publicstring用户名{get;放;}[XmlElement]publicPasswordPassword{get;放;}}publicclassPassword{publicPassword(){Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";}[XmlAttribute]publicstringType{get;放;}[XmlText]公共字符串值{得到;放;我没有在UsernameTokenXML中添加Nonce位,但它与Password非常相似还需要添加Created元素,但它是一个简单的[XmlElement]。上面的答案是错误的!不要添加自定义标头。从您的示例xml来看,它是一个标准的WS-Security标头。WCF绝对支持开箱即用。添加服务引用时,应该在配置文件中为您创建basicHttpBinding绑定。您必须修改它以包含一个具有TransportWithMessageCredential架构的安全元素和一个具有clientCredentialType=UserName的消息元素:上面的配置告诉WCF期望通过HTTPS在SOAP标头中有一个用户标识/密码。然后,您可以在调用之前在代码中设置ID/密码:varservice=newMyServiceClient();service.ClientCredentials.UserName.UserName="用户名";service.ClientCredentials.UserName.Password="密码";除非这个特定的服务提供商偏离标准,否则它应该工作。添加自定义硬编码标头可能有效(有时会被拒绝),但这是完全错误的方法。WSSE的目的是安全。为此,Microsoft发布了MicrosoftWebServicesEnhancements2.0,随后又发布了WSE3.0。您需要安装此包(http://www.microsoft.com/en-us/download/details.aspx?id=14089)。该文档不容易理解,尤其是对于那些没有使用过SOAP和WS-Addressing的人来说。首先,“BasicHttpBinding”是Soap1.1,它不会为您提供与WSHttpBinding相同的标头。安装包并查看示例。您需要从WSE3.0引用DLL,还需要正确设置消息。WSAddressing标头有许多变体。您正在寻找的是UsernameToken配置。这是一个较长的解释,我应该为每个人写一些东西,因为我在任何地方都找不到正确的答案。至少您需要从WSE3.0包开始。假设您的web.config中有名称localhost服务引用,那么您可以按如下方式执行此操作localhost.ServiceobjWebService=newlocalhost.Service();localhost.AuthSoapHdobjAuthSoapHeader=newlocalhost.AuthSoapHd();stringstrUsrName=ConfigurationManager.AppSettings["用户名"];stringstrPassword=ConfigurationManager.AppSettings["密码"];objAuthSoapHeader.strUserName=strUsrName;objAuthSoapHeader.strPassword=strPassword;objWebService.AuthSoapHdValue=objAuthSoapHeader;字符串str=objWebService.HelloWorld();;假设您正在使用HttpWebRequest和HttpWebResponse调用Web服务,因为.Net客户端不支持您尝试使用的WSLD结构。在这种情况下,您可以在标头上添加安全凭证,例如:YOU_USERNAME/wsse:Username>YOU_PASSWORD3WSOKcKKm0jdi3943ts1AQ==2015-01-12T16:46:58.386Z您可以使用SOAPUI通过http日志获取wsse安全性。请小心,因为它不是安全的解决方案。我从这里得到了一个更好的方法:WCF:创建自定义标头,如何添加和使用这些标头客户端识别自己这里的目标是让客户端提供某种信息,服务器可以使用这些信息来确定谁发送了消息。以下C#代码将添加一个名为ClientId的标头:varcl=newActiveDirectoryClient();vareab=newEndpointAddressBuilder(cl.Endpoint.Address);eab.Headers.Add(AddressHeader.CreateAddressHeader("ClientId",//标头名称string.Empty,//命名空间"OmegaClient"));//标头值cl.Endpoint.Address=eab.ToEndpointAddress();//现在执行service.cl.ProcessInfo("ABC")提供的操作;代码所做的是添加一个名为ClientId的端点标头,其值为OmegaClient以插入到没有命名空间的soap标头中。客户端配置文件中的自定义标头还有另一种强制自定义标头的方法。这可以在客户端的Xml配置文件中实现,其中所有消息都通过将自定义标头指定为端点的一部分来发送,如下所示:Console_Client显然,这篇文章已有多年历史-但事实是我正在寻找类似的问题确实找到了。在我们的例子中,我们必须将用户名/密码信息添加到安全标头。这与在安全标头之外添加标头信息不同。执行此操作的正确方法(对于自定义绑定/authenticationMode="CertificateOverTransport")(如.Net框架版本4.6.1),是像往常一样添加客户端凭据:client.ClientCredentials.UserName.UserName="[username]";client.ClientCredentials.UserName.Password="[密码]";然后在安全绑定元素中添加“令牌”——因为当身份验证模式设置为证书时,默认情况下不包括用户名/密码凭据。您可以像这样设置此令牌://获取当前绑定System.ServiceModel.Channels.Bindingbinding=client.Endpoint.Binding;//获取绑定元素BindingElementCollectionelements=binding.CreateBindingElements();//定位安全绑定元素SecurityBindingElementsecurity=elements.Find();//这不应该为null-因为无论如何我们都在使用证书身份验证if(security!=null){uTokenParams.InclusionMode=SecurityTokenInclusionMode.AlwaysToRecipient;security.EndpointSupportingTokenParameters.SignedEncrypted.Add(uTokenParams);}client.Endpoint.Binding=newCustomBinding(elements.ToArray());应该这样做。如果没有上述代码(显式添加用户名令牌),即使您在客户端凭据中设置了用户名信息,也可能无法将这些凭据传递给服务。以上就是C#学习教程:Howtopasstheusername/passwordintheheadertotheSOAPWCFservice的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处: