Saltar al contenido

¿Cómo puedo pasar un nombre de usuario/contraseña en el encabezado a un servicio SOAP WCF?

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.

Te mostramos las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *