Hola, descubrimos la solución a tu búsqueda, has scroll y la encontrarás aquí.
Solución:
¡Las respuestas anteriores son tan incorrectas! NO agregue encabezados personalizados. A juzgar por su xml de muestra, es un encabezado estándar de WS-Security. WCF definitivamente lo admite desde el primer momento. Cuando agrega una referencia de servicio, debe tener un enlace basicHttpBinding creado para usted en el archivo de configuración. Deberá modificarlo para incluir elemento de seguridad con modo TransportWithMessageCredential y elemento de mensaje con clientCredentialType = UserName:
La configuración anterior le dice a WCF que espere ID de usuario/contraseña en el encabezado SOAP sobre HTTPS. Luego puede configurar id/contraseña en su código antes de hacer una llamada:
var service = new MyServiceClient();
service.ClientCredentials.UserName.UserName = "username";
service.ClientCredentials.UserName.Password = "password";
A menos que este proveedor de servicios en particular se desvíe del estándar, debería funcionar.
Probablemente haya una forma más inteligente, pero puede agregar los encabezados manualmente de esta manera:
var client = new IdentityProofingService.IdentityProofingWSClient();
using (new OperationContextScope(client.InnerChannel))
OperationContext.Current.OutgoingMessageHeaders.Add(
new SecurityHeader("UsernameToken-49", "12345/userID", "password123"));
client.invokeIdentityService(new IdentityProofingRequest());
Aquí, SecurityHeader
es una clase implementada personalizada, que necesita algunas otras clases ya que elegí usar attributes para configurar la serialización XML:
public class SecurityHeader : MessageHeader
private readonly UsernameToken _usernameToken;
public SecurityHeader(string id, string username, string password)
_usernameToken = new UsernameToken(id, username, password);
public override string Name
get return "Security";
public override string Namespace
get return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
XmlSerializer serializer = new XmlSerializer(typeof(UsernameToken));
serializer.Serialize(writer, _usernameToken);
[XmlRoot(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class UsernameToken
public UsernameToken()
public UsernameToken(string id, string username, string password)
Id = id;
Username = username;
Password = new Password() Value = password;
[XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
public string Id get; set;
[XmlElement]
public string Username get; set;
[XmlElement]
public Password Password get; set;
public class Password
public Password()
Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
[XmlAttribute]
public string Type get; set;
[XmlText]
public string Value get; set;
no he agregado el Nonce
poco a la UsernameToken
XML, pero es muy similar al Password
una. los Created
El elemento también debe agregarse todavía, pero es un simple [XmlElement]
.
Agregar un encabezado codificado de forma personalizada puede funcionar (también puede ser rechazado a veces), pero es totalmente la forma incorrecta de hacerlo. El propósito del WSSE es la seguridad. Microsoft lanzó Microsoft Web Services Enhancements 2.0 y, posteriormente, WSE 3.0 exactamente por este motivo. Debe instalar este paquete (http://www.microsoft.com/en-us/download/details.aspx?id=14089).
La documentación no es fácil de entender, especialmente para aquellos que no han trabajado con SOAP y WS-Addressing. En primer lugar, “BasicHttpBinding” es Soap 1.1 y no le dará el mismo encabezado de mensaje que WSHttpBinding. Instale el paquete y mire los ejemplos. Deberá hacer referencia a la DLL de WSE 3.0 y también deberá configurar su mensaje correctamente. Hay una gran cantidad de variaciones en el encabezado de direccionamiento de WS. El que está buscando es la configuración de UsernameToken.
Esta es una explicación más larga y debería escribir algo para todos ya que no puedo encontrar la respuesta correcta en ninguna parte. Como mínimo, debe comenzar con el paquete WSE 3.0.