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.