Utilisation de Linq to XML pour ajouter un header en WCF

Il est parfois indispensable de rajouter via des MessageInterceptor des informations dans le header en WCF. Cependant, il est parfois compliqué de créer un XML "propre". Linq to XML est la pour nous aider... Ce post explique comment ajouter dans le header l'élément lié à la sécurité WSSE UserNameToken.

Nous analysons le contenu XML se trouvant dans le header. Nous utilisons des namespace et des préfixes pour éviter tout conflit de nom. En suivant les spec de WSSE UserNameToken, nous obtenons ce fichier ci:

<Envelope xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd">
  <Header>
    <wsse:Security>
      <wsse:UsernameToken
       xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd"
       xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd">
        <wsse:Username>NNK</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
wss-username-token-profile-1.0#PasswordDigest">D2A12DFE8D9F0C6BB82C89B091DF5C8A872F94DC</wsse:Password>
        <wsse:Nonce>EFD89F06CCB28C89</wsse:Nonce>
        <wsu:Created>2001-10-13T09:00:00Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </Header>
  <Body>
  </Body>
</Envelope>

Nous allons donc réaliser simplement notre contenu XML via Linq to XML. Nous définissons nos prefixes et nous attachons nos différents éléments à notre noeud. Le noeud lié a la sécurité est ajouté à la création du header dans le message WCF. Nous ne pouvons pas préciser de prefixe de namespace à cet endroit. Nous utilisons donc le namespace complet.

string userName = "NNK";
string passDigest = "D2A12DFE8D9F0C6BB82C89B091DF5C8A872F94DC";
string nonce = "EFD89F06CCB28C89";
string created = "2001-10-13T09:00:00Z";
XNamespace wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd";
XNamespace wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd";
XNamespace passwordDigest = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest";
XElement userNameToken = new XElement(wsse + "UserNameToken",
                    new XAttribute(XNamespace.Xmlns + "wsse", wsse),
                    new XAttribute(XNamespace.Xmlns + "wsu", wsu),
                    new XElement(wsse + "UserName", userName),
                    new XElement(wsse + "Password"new XAttribute("Type", passwordDigest), passDigest),
                    new XElement(wsse + "Nonce", nonce),
                    new XElement(wsu + "Created", created));
var x = new MessageHeader<XElement>(userNameToken);
var headerWsse = x.GetUntypedHeader("Security""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd");

Il suffit après d'intégrer dans un intercepteur côté client de ce header ci-dessus et le serveur pourra valider l'identité de l'utilisateur.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet

Page top