2012-05-22 3 views
1

Мне нужно запросить службу WS Trust 1.4 с помощью .NET, чтобы включить сценарий аутентификации SAML 2.0.Query WS-Trust 1.4 STS с .NET/WIF/WCF

EDIT: Чтобы быть более точным, мне нужно поддерживать вызов взаимодействия с пользователем на стороне клиента, который определен в WS Trust 1.4.

Я изучил WIF, который обеспечивает прямой доступ к WS Trust через WSTrustChannelFactory (см. TrustChannelFactory.TrustVersion в codenippet ...), но кажется, что есть только поддержка WS-Trust 1.3 и Feb2005?

  WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory(getBinding(), "http:/localhost..."); 

      trustChannelFactory.TrustVersion = TrustVersion.WSTrust13; 
      WSTrustChannel channel = (WSTrustChannel)trustChannelFactory.CreateChannel(); 

      RequestSecurityToken rst = new RequestSecurityToken(); 

      RequestSecurityTokenResponse rstr = null; 
      SecurityToken token = channel.Issue(rst, out rstr); 

Кто-нибудь знает, как реализовать такой прямой запрос WS-Trust, используя .NET?

Я не могу использовать привязку WSHttpFederation, так как нам нужно работать с SAML 2.0 и вам необходимо получить запросы на аутентификацию SAMl 2.0 с сервера приложений, прежде чем передавать их в IdP.

Я мог бы, конечно, свернуть свой клиентский WS-Trust 1.4. но, возможно, есть более простой способ ...

+0

Вы пробовали фрагмент кода без установки «TrustVersion»? Возможно, что пространство имен WSTrust использует WS Trust 1.4 как значение по умолчанию, и вам нужно только установить «TrustVersion» для версии 1.3 или 2005. К сожалению, я не смог найти этот документ в MSDN, но я видел, что пространство имен имеет константы для WS Trust 1.4. Его стоит попробовать хотя бы. –

+0

Я просто заглянул внутрь реализации WIF. Расширение интерактивной задачи пользователя, определенное в WS Trust 1.4. не реализовано в WIF. Я нашел сообщение (http://social.msdn.microsoft.com/Forums/en-US/Geneva/thread/e0af7d8b-39d8-40d2-b349-efcc7cd1af32/) от кого-то, кто сталкивался с такими же проблемами с другим вызов от WS Trust 1.3. Так что в основном это не параметр версии, который является проблемой. Я должен расширить WIF, чтобы иметь возможность поддерживать расширение вызова ... –

+0

Слишком плохо. Похоже, что когда информация InfCard (или что-то еще называемая) взорвалась, в Microsoft появился пакет для повышения/поддержки функций безопасности на основе стандартов. Я знаю, что Мишель Бустаманте из славы WCF продолжала становиться гуру безопасности, возможно, она написала о расширении WIF. :) –

ответ

2

Я расширил реализацию WIF WS Trust с использованием методов .NET Extension. Здесь вы можете увидеть первую часть (запрос на запрос с запросом RST и SAML Authn) в качестве примера того, как повторно использовать вещи, которые уже определены в WIF. Я использовал IL Disassembler, чтобы посмотреть, как все делается в WIF, что было очень полезно на пути ...

internal static RequestSecurityTokenResponseWithSAML2Assertion Issue(this WSTrustChannel pThis, 
     string pSAML2AuthnRequest, 
     Func<ProfileSelectionChallengeType, wsTrust14.ChoiceSelectedType> pProfileSelectionCallback) 
    { 
     if (pThis != null) 
     { 
      if (pThis.ChannelFactory != null && 
       pThis.ChannelFactory.Endpoint != null && 
       pThis.ChannelFactory.Endpoint.Binding != null) 
      { 
       // Create RST Request 
       RequestSecurityToken rst = new RequestSecurityToken("http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue"); 
       rst.TokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"; 

       // we use WS Trust 1.4 but .NET WIF only provides support for WS Trust 1.3 
       // so we add the needed Challenge support and reuse most of the WIF stuff 
       if (pThis.TrustVersion != System.ServiceModel.Security.TrustVersion.WSTrust13) 
       { 
        throw new Exception("Given WS Trust Version not supported!"); 
       } 

       // create a WS Trust 1.3 SOAP Message 
       Message issueRequest = Message.CreateMessage(pThis.ChannelFactory.Endpoint.Binding.MessageVersion, 
        "http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue", 
        new WSTrustRequestBodyWriter(rst, 
         pThis.WSTrustRequestSerializer, 
         pThis.WSTrustSerializationContext)); 

       // add SAML Authn Request to the WS Trust request 
       XmlDocument messageAsXml = issueRequest.serializeToXml(); 
       messageAsXml = SAMLSupport.addSAMLAuthenticationRequest(messageAsXml, pSAML2AuthnRequest); 
       issueRequest = issueRequest.generateFromXml(messageAsXml); 

       // invoke the WS Trust service on the STS 
       Message responseMessage = pThis.Issue(issueRequest); 

       // check what we received as answer... 
       var response = pThis.parseAndHandleResponse(responseMessage, pProfileSelectionCallback); 
       return response; 
      } 
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^