RequestSecurityTokenResponse no se deserializará

Tengo un cliente WCF que se conecta a un servidor STS, sobre el cual no tengo ningún control (es un servicio PHP de terceros).

Después de días de investigación, logré hablar con el servidor de una manera que acepta usar puramente WCF. Por supuesto, hubiera sido fácil simplemente poner algunos caracteres en la red, ignorando todo el material de SOAP. Pero al final logré adivinar todos los parámetros de configuración correctamente, por lo que el servicio STS responde a mi solicitud de esta manera

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  <Body>
    <RequestSecurityTokenResponse xmlns="http://schemas.xmlsoap.org/ws/2005/02/trust">
      <TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</TokenType>
      <RequestedSecurityToken>
        <SecurityContextToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
              <Identifier>bipro:D5J9M0...</Identifier>
        </SecurityContextToken>
      </RequestedSecurityToken>
    </RequestSecurityTokenResponse>
  </Body>
</Envelope>

Pero ahora tengo problemas para extraer el valor del identificador. Para mi clase de proxy (SecurityTokenServicePortTypeClient : ClientBase<SecurityTokenServicePortType>, SecurityTokenServicePortType) Probé todas las combinaciones imaginables de ServiceContract, DataContract y XmlSerialization sobre todos los tipos. Pero todo lo que obtengo es null.

La interfaz (muy modificada) para el contrato de servicio se ve así

[ServiceContract(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/trust")]
public interface SecurityTokenServicePortType {
  [OperationContract(Action = "urn:RequestSecurityToken", ReplyAction = "*")]
  object RequestSecurityToken();
}

La clase de implementación (muy modificada) tiene un método como este

object SecurityTokenServicePortType.RequestSecurityToken() {
  var x = base.Channel.RequestSecurityToken();
  return x;
}

x es siempre null.

En lugar de un tipo de retorno de object fue originalmente RequestSecurityTokenResponse y así sucesivamente.

Tuve el mismo problema con WSE hace años y pude resolverlo simplemente usando la combinación correcta de, por ejemplo XmlElementAttribute para controlar el proceso de deserialización. Pero esta vez no parece ayudar.

Gracias por cualquier consejo!

Björn

preguntado el 03 de mayo de 12 a las 21:05

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.