상황은 다음과 같이이다 :SAML 어설 션 토큰을 사용하여 SOAP 메시지 (본문 및 헤더 요소)에 서명하려면 어떻게합니까?
- 은 내가
GenericXmlSecurityToken
의 형태로 아래 STS에서 보안 토큰을 가지고 (나는 또한 그것의 SAML 어설 요소가). - 이 보안 토큰을 사용하여
WS2007FederationHttpBinding
이 할 수있는 것 외에도 요청에 약간의 추가 작업이 필요한 타사 서비스를 호출해야합니다. - SOAP 보안 헤더의 SAML 어설 션 요소 외에도 실제 SOAP 요청에는 타임 스탬프 요소에 서명하고 SAML 어설 션을 사용하여 본문 요소에 서명하는 서명 요소 (네임 스페이스
http://www.w3.org/2000/09/xmldsig#
)가 있어야합니다. WS2007FederationHttpBinding
과 마찬가지로 많은 맞춤 바인딩 수정은 값 유형이http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID
(SAML 어설 션) 인 주요 참조 요소를 서명에 포함 할 수 없습니다.- 대부분 (내가
ProtectTokens
= true를 통해) 서명 된 SAML 어설 션 요소이지만 그 이상을 벗어날 수는 없습니다.<soapenv:Header> <wsse:Security> <saml:Assertion="" AssertionID = "ID_56eecf2a-a143-4ec9-ab85-479d8602122f"> ... </saml:Assertion> <WSU:Timestamp> ... </WSU:Timestamp> <ds:Signature> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="xml-exc-c14n#"/> <ds:SignatureMethod Algorithm="#rsa-sha1"/> <!--Body signature--> <ds:Reference URI="#id"> <ds:Transforms> < ds: Transform Algorithm = "xml-exc-c14n #" /> </ds:Transforms> <ds:DigestMethod Algorithm="#sha1"/> <ds:DigestValue > di3JiPJM90D3P62ChO1d4Sy12 + 4 = </ds:DigestValue DigestValue> </ds:Reference> <!--Timestamp element signature--> <ds:Reference URI = "#Timestamp" > <ds:Transforms> <ds:Transform Algorithm = "xml-exc-c14n #" /> </ds:Transforms> <ds:DigestMethod Algorithm="#sha1"/> < ds:DigestValue>C+GkwwH5RuXocsD0iphwUvmQpj0=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>kq+FG6qqdx...==</ds:SignatureValue> <!--Key reference, pointing back to the SAML assertion element--> <!--This is the actual problem. Didn't manage to add this at all.--> <ds:KeyInfo> <wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0 #SAMLAssertionID"> ID_56eecf2a-a143-4ec9-ab85-479d8602122f</wsse:KeyIdentifier> </wsse:SecurityTokenReference> </ds:KeyInfo> </ds:Signature> </wsse:Security> </soapenv:Header> <soapenv:Body wsu:Id="id"> ... </soapenv:Body>
나뿐만 나는
WS2007FederationHttpBinding
(또는 사용자 정의 바인딩) 구성 할 수 있습니다 방법에 손실에서, 그러나, 나는 추가하려면 :
기본적으로, 내가 요청에 들어갈 때 필요한 것은 이것이다 서명. 서명을 내가 요청의 토큰을 얻을 수 있지만 : 나는 또한 같은 결과와 더불어, TransportSecurityBindingElement
를 사용하여 시도,이 외에도
/**
*
* Federation binding stuff
*
*/
var federationBinding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
federationBinding.Security.Message.EstablishSecurityContext = false;
federationBinding.Security.Message.IssuedKeyType = SecurityKeyType.AsymmetricKey;
federationBinding.Security.Message.NegotiateServiceCredential = false;
federationBinding.Security.Message.IssuedTokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID";
federationBinding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256;
/**
*
* Custom binding, the one actually used by the channel
*
*/
var binding = new CustomBinding(federationBinding.CreateBindingElements());
binding.Elements.Remove(binding.Elements.FirstOrDefault(i => i is TextMessageEncodingBindingElement));
var messageSecurity = (TransportSecurityBindingElement)binding.Elements.FirstOrDefault(i => i is TransportSecurityBindingElement);
//Remove it, I add another one later
binding.Elements.Remove(messageSecurity);
//Security element configuration
var secBinding = new AsymmetricSecurityBindingElement()
{
MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10,
ProtectTokens = true,
SecurityHeaderLayout = SecurityHeaderLayout.Lax,
IncludeTimestamp = true,
EnableUnsecuredResponse = true,
DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256
};
secBinding.InitiatorTokenParameters = new IssuedSecurityTokenParameters(
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID");
secBinding.RecipientTokenParameters = new IssuedSecurityTokenParameters(
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID");
secBinding.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
:
것은 지금 함께 일하고 무엇.
모든 아이디어/힌트를 환영합니다.