SOAP消息错误的C#安全凭据-WS-Security(WSS)

SOAP消息错误的C#安全凭据-WS-Security(WSS),c#,web-services,soap,C#,Web Services,Soap,我试图在必须使用WS-Security的WebReference(web服务)客户端上调用一个方法。当我执行cargaFicheiro方法时,它返回以下错误: 提供了无效的安全令牌(处理时出错) 用户名令牌) 我使用的代码是: // Cuidamos is a WebReference do a WSDL url in https var token = new UsernameToken("Username", "Password", PasswordOption.SendPlainText

我试图在必须使用WS-Security的WebReference(web服务)客户端上调用一个方法。当我执行cargaFicheiro方法时,它返回以下错误:

提供了无效的安全令牌(处理时出错) 用户名令牌)

我使用的代码是:

// Cuidamos is a WebReference do a WSDL url in https

var token = new UsernameToken("Username", "Password", PasswordOption.SendPlainText);

var serviceProxy = new Cuidamos.CargaFicheiroServiceImplService();

SoapContext requestContext = serviceProxy.RequestSoapContext;
requestContext.Security.Timestamp.TtlInSeconds = 300;
requestContext.Security.Tokens.Add(token);

var result = serviceProxy.cargaFicheiro();
SOAP标头必须与此标头匹配:

<soap:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1">
        <wsu:Timestamp wsu:Id="TS-2">
            <wsu:Created>2013-10-07T10:13:52Z</wsu:Created>
            <wsu:Expires>2013-10-07T10:20:32Z</wsu:Expires>
        </wsu:Timestamp>
        <wsse:UsernameToken wsu:Id="UsernameToken-1">
            <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>
    </wsse:Security>
</soap:Header>

2013-10-07T10:13:52Z
2013-10-07T10:20:32Z
用户名
密码
我已使用以下答案来实现我的代码:

基于Microsoft,我正在以正确的方式进行所有工作:

另一个答案同样有效,但我的情况并非如此:


谢谢。

我的问题几乎解决了

我注意到,此代码生成的SOAP头如下所示:

<soapenv:Header>
    <wsa:Action></wsa:Action>
    <wsa:MessageID>uuid:2eead708-03f9-4624-a866-35f3730eac23</wsa:MessageID>
    <wsa:ReplyTo>
        <wsa:Address>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
    <wsa:To>https://cuidamos.com/ws/cuidamos</wsa:To>
    <wsse:Security soapenv:mustUnderstand="1">
        <wsu:Timestamp wsu:Id="Timestamp-64f67137-f82d-4a9c-8b2e-1cc41104683d">
            <wsu:Created>2019-06-27T12:48:00Z</wsu:Created>
            <wsu:Expires>2019-06-27T12:53:00Z</wsu:Expires>
        </wsu:Timestamp>
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-b8467c25-c62c-406a-9831-46e6c676153a">
            <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:Nonce>JEmovy7RDpapzumPTiUUgQ==</wsse:Nonce>
            <wsu:Created>2019-06-27T12:48:00Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>
现在我遇到了另一个问题,用户名和密码子项创建成功,但Nonce子项在运行时被重写,这意味着用户名和密码的创建与我的代码完全相同,但Nonce继续创建,而没有EncondingType,innerText哈希字符串与我的代码创建的不同

编辑2

通过添加以下代码,我完成了一个简单的测试

document.AppendChild(usernameTokenElement);

var xml = token.GetXml(document);
若我检查文档,我可以看到带有EncodingType属性的Nonce元素,但若我检查xml,它在Nonce元素上并没有EncodingType属性

编辑3

问题已解决,但未回答编辑2的问题。 简言之,现在不再需要该端点,负责管理该端点的部门已经在服务器上完成了该配置。
在UsernameToken WSS规范中,其规定不需要Nonce和Created,因此通过这种假设,问题就这样解决了,记住此请求是在https(SSL隧道)上发出的。

WSSE Nonce是一种安全属性,具有唯一标识符,用于防止重播攻击。您的服务器可能会生成此消息,因为您在服务配置中配置了自定义服务绑定

它应该只工作一次,这可能就是为什么不能从SOAPUI重用它的原因

更多信息请点击此处:


但是如果soap请求是通过https发送的,那么我需要这个临时消息吗?我没有任何自定义服务绑定。管理此服务的团队提供的文档没有引用Soap标头中的Nonce元素,因此我假设这不是必需的。我还尝试生成不同的Nonce短语并在Soap UI中使用它,它返回相同的错误。我使用了你发布的west wind博客中的GetSHA1String(短语)方法。Cuidamos.CargaficheroserviceImplService()做什么?它将从服务引用(而不是Web引用)legacy btw生成代理。不知道我是否回答了你的问题。
document.AppendChild(usernameTokenElement);

var xml = token.GetXml(document);