Дублирование BinarySecurityToken, когда я пытаюсь подписать его - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно использовать веб-сервис, используя C #, где запрос на мыло должен иметь следующий формат

<wsse:Security mustUnderstand="true">
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        ...
        <ds:Reference URI="#id-71a64e41-a0da-491b-b9ae-9b36b5a13b2d">
            ...
        </ds:Reference>
    </ds:SignedInfo>
    <ds:KeyInfo>
        <wsse:SecurityTokenReference>
            <wsse:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile1.0#X509v3" URI="#id-71a64e41-a0da-491b-b9ae-9b36b5a13b2d"/>
        </wsse:SecurityTokenReference>
    </ds:KeyInfo>
</ds:Signature>
<wsse:BinarySecurityToken wsu:Id="id-71a64e41-a0da-491b-b9ae9b36b5a13b2d">MIIEJzCCAw...</wsse:BinarySecurityToken>

BinarySecurityToken представлен только один раз и имеет две ссылки на «Id». Но если я подпишу его, у меня будет два одинаковых BinarySecurityToken с другим «Id». Как я могу предотвратить это дублирование?

<wsse:Security mustUnderstand="true">
...
<wsse:BinarySecurityToken u:Id="uuid-8ae8c9cb-b6b7-4175-915d-818ea792fcef-3">MIIEJzCCAw...</wsse:BinarySecurityToken>
<wsse:BinarySecurityToken u:Id="uuid-8ae8c9cb-b6b7-4175-915d-818ea792fcef-1">MIIEJzCCAw...</wsse:BinarySecurityToken>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>...
        <Reference URI="#uuid-8ae8c9cb-b6b7-4175-915d-818ea792fcef-1">
        ...
        </Reference>
    </SignedInfo>
    <SignatureValue>...base64string...</SignatureValue>
    <KeyInfo>
        <o:SecurityTokenReference>
            <o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#uuid-8ae8c9cb-b6b7-4175-915d-818ea792fcef-3"/>
        </o:SecurityTokenReference>
    </KeyInfo>
</Signature>

Мой переплет:

AsymmetricSecurityBindingElement asbe = new AsymmetricSecurityBindingElement
        {
            MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10,

            InitiatorTokenParameters = new X509SecurityTokenParameters
            {
                InclusionMode = SecurityTokenInclusionMode.Once,
                ReferenceStyle = SecurityTokenReferenceStyle.Internal,
            },
            RecipientTokenParameters = new X509SecurityTokenParameters
            {
                InclusionMode = SecurityTokenInclusionMode.Once,
                ReferenceStyle = SecurityTokenReferenceStyle.Internal
            },

            MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt,

            SecurityHeaderLayout = SecurityHeaderLayout.Strict,
            EnableUnsecuredResponse = true,
            IncludeTimestamp = true,
            ProtectTokens = true,
            DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256,
            AllowInsecureTransport = true
        };

        asbe.LocalServiceSettings.TimestampValidityDuration = TimeSpan.FromMinutes( 1 );
        asbe.SetKeyDerivation( false );

        asbe.EndpointSupportingTokenParameters.Signed.Add( asbe.InitiatorTokenParameters );
        HttpsTransportBindingElement transport = new HttpsTransportBindingElement()
        {
            RequireClientCertificate = true
        };

        var textMessageEncoding = new TextMessageEncodingBindingElement( MessageVersion.Soap11, Encoding.UTF8 );

        return new CustomBinding( asbe, textMessageEncoding, transport );

Я нашел ту же проблему в комментариях к другим вопросам, но не могу найти решение.

...