为 Soap 请求生成用户名令牌

Generating Username Token For Soap Request

我正在尝试使用 C# 生成 SOAP 用户名令牌但没有成功

  <wsse:UsernameToken wsu:Id='UsernameToken-1231231231123123'>
         <wsse:Username>UserName</wsse:Username>
          <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>Password</wsse:Password>
                                             </wsse:UsernameToken>

上面的格式是我们 SOAP 端点的正确格式,但是当我尝试使用来自命名空间

的 UsernameToken 生成令牌时

Microsoft.Web.Services2.Security.Tokens

    UsernameToken t;
    t = new UsernameToken("UserName", "Password");
    string usernameTokenSection1 = t.GetXml(new XmlDocument()).OuterXml.ToString();

我得到了这个结果 不工作

    <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-cf96131b-1528-46a1-8f00-f61af616db91" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>Username</wsse:Username>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">+S3AH9NHRtOpgdxEwqIVIg==</wsse:Nonce><wsu:Created>2020-04-04T06:46:53Z</wsu:Created></wsse:UsernameToken>

wsu:Id='UsernameToken-1231231231123123' 属性是 Id 属性 的 UsernameToken

所以,你这样做:

UsernameToken t = new UsernameToken("UserName", "Password", PasswordOption.SendPlainText)
{ 
    Id = "UsernameToken-1231231231123123"                 
};

然后您可以在 XmlDocumentXDocument 中解析它,这将使您能够调整元素以满足您的要求。

你可以这样解析var doc = XDocument.Parse(usernameTokenSection1);

现在,使用解析后的 XML,您可以根据需要进行调整。例如,您可以像这样删除 NonceCreated 元素:

var doc = XDocument.Parse(usernameTokenSection1);

XNamespace wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
XNamespace wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

doc.Root.Descendants(wsse + "Nonce").Remove();
doc.Root.Descendants(wsu + "Created").Remove();