2014-09-08 9 views
0

상황은 다음과 같이이다 :SAML 어설 션 토큰을 사용하여 SOAP 메시지 (본문 및 헤더 요소)에 서명하려면 어떻게합니까?

  1. 은 내가 GenericXmlSecurityToken의 형태로 아래 STS에서 보안 토큰을 가지고 (나는 또한 그것의 SAML 어설 요소가).
  2. 이 보안 토큰을 사용하여 WS2007FederationHttpBinding이 할 수있는 것 외에도 요청에 약간의 추가 작업이 필요한 타사 서비스를 호출해야합니다.
  3. SOAP 보안 헤더의 SAML 어설 션 요소 외에도 실제 SOAP 요청에는 타임 스탬프 요소에 서명하고 SAML 어설 션을 사용하여 본문 요소에 서명하는 서명 요소 (네임 스페이스 http://www.w3.org/2000/09/xmldsig#)가 있어야합니다.
  4. WS2007FederationHttpBinding과 마찬가지로 많은 맞춤 바인딩 수정은 값 유형이 http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID (SAML 어설 션) 인 주요 참조 요소를 서명에 포함 할 수 없습니다.
  5. 대부분 (내가 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; 

:

것은 지금 함께 일하고 무엇.

모든 아이디어/힌트를 환영합니다.

답변

1

JAX-WS를 사용하여 클라이언트를 Java로 구현했습니다. 이는 JAX-WS API가 WS-Security SOAP 엘리먼트 (wsse : Security)에 잘 매핑 (때로는 1 : 1)되기 때문에 원활하게 작동했습니다.

기본적으로 STS를 호출 한 사용자 지정을 구현 한 다음 SAML 토큰을 사용하여 wsse:Security 요소를 만들고 토큰과 함께 보내는 요청의 타임 스탬프와 본문에 서명합니다.

답변으로 표시하지 않으려면 실제로는 그렇지 않습니다. 그냥 대안. 또한이 질문에 대한 Tumbleweed 배지를 받았습니다 (만세).