example ejemplo c# wcf visual-studio-2012 ws-security asp.net-4.5

example - ws-security ejemplo c#



Con C#, WCF SOAP consumidor que usa autenticación de texto plano WSSE? (2)

Esa es la solicitud del token WS-SecureConversation. WSHttpSecurity usa de WSHttpSecurity predeterminada a menos que cambie su propiedad EstablishSecurityContext a false . Use este enlace en su lugar:

var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

Utilizará SOAP 1.1 con el token UserName y requerirá transporte HTTPS.

Editar:

Para realizar pruebas sin HTTPS intente utilizar este enlace personalizado:

var securityElement = SecurityBindingElement.CreateUserNameOverTransportBindingElement(); securityElement.AllowInsecureTransport = true; var encodingElement = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8); var transportElement = new HttpTransportBindingElement(); var binding = new CustomBinding(securityElement, encodingElement, transportElement);

Tengo un consumidor WCF SOAP implementado por Visual Studio 2012 desde un WSDL. WSDL fue generado por PeopleTools. El objeto base es de tipo System.ServiceModel.ClientBase .

Necesito la solicitud SOAP para parecerse a:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://xmlns.oracle.com/Enterprise/Tools/schemas"> <soapenv:Header> <wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>[plain text username goes here]</wsse:Username> <wsse:Password>[plain text password goes here]</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <sch:InputParameters> <Last_Name>Aren</Last_Name> <First_Name>Cambre</First_Name> </sch:InputParameters> </soapenv:Body> </soapenv:Envelope>

Esto es lo más cercano que podemos obtener:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> <s:Header> <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action> <a:MessageID>urn:uuid:3cc3f2ca-c647-466c-b38b-f2423462c837</a:MessageID> <a:ReplyTo> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> </a:ReplyTo> <a:To s:mustUnderstand="1">http://[internal URL to soap listener]</a:To> </s:Header> <s:Body> <t:RequestSecurityToken Context="uuid-7db82975-2b22-4236-94a1-b3344a0bf04d-1" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"> <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType> <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType> <t:KeySize>256</t:KeySize> <t:BinaryExchange ValueType=" http://schemas.xmlsoap.org/ws/2005/02/trust/tlsnego" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">FgMBAFoBAABWAwFQ9IhUFGUO6tCH+0baQ0n/3us//MMXzQA78Udm4xFj5gAAGAAvADUABQAKwBPAFMAJwAoAMgA4ABMABAEAABX/AQABAAAKAAYABAAXABgACwACAQA=</t:BinaryExchange> </t:RequestSecurityToken> </s:Body> </s:Envelope>

Notarás dos problemas:

  • No hay credenciales WSSE de texto sin formato. Pasa una forma binaria de las credenciales que el servicio no usará.
  • La autenticación está en el Body , no en el Header .
  • La solicitud omite InputParameters .

Aquí está el código esencial de C #:

var service = new ServiceWithBizarreNameFromPeoplesoft(); if (service.ClientCredentials == null) throw new NullReferenceException(); service.ClientCredentials.UserName.UserName = "test"; service.ClientCredentials.UserName.Password = "password"; var binding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential) {Security = new WSHttpSecurity()}; service.Endpoint.Binding = binding; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; binding.Security.Mode = SecurityMode.Message; var input = new InputParameters { Last_Name = "Cambre", First_Name = "Aren" }; var returnData = service.BizarrePeopleSoftNameForMethod(input);

No hay seguridad de capa HTTP, y el transporte está cifrado con SSL. La autenticación solo se basa en el mensaje SOAP.


Esto me parece a wsHttpBindings con seguridad de transporte usando autenticación de contraseña de usuario básica.

Estas líneas me parecen incorrectas:

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; binding.Security.Mode = SecurityMode.Message;

Así es como esperaría ver esto configurado en su aplicación o web.config

<bindings> <wsHttpBinding> <binding name="ws" > <security mode="Transport"> <transport clientCredentialType="Basic" proxyCredentialType="Basic" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://www.bla.com/webservice" binding="basicHttpBinding" contract="bla.IService" name="ws" /> </client>

Entonces el código se vería así:

var service = new GeneratedProxyClient("basic"); service.ClientCredentials.UserName.UserName = "test"; service.ClientCredentials.UserName.Password = "password"; var input = new InputParameters { Last_Name = "Cambre", First_Name = "Aren" }; var returnData = service.BizarrePeopleSoftNameForMethod(input);

Se podría explicar mejor aquí -> http://msdn.microsoft.com/en-us/library/ms733775.aspx