Запрос WS-Trust 1.4 STS с .NET/WIF/WCF

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

РЕДАКТИРОВАТЬ: Чтобы быть более точным, мне нужно поддерживать вызов взаимодействия с пользователем на стороне клиента, который определен в WS Trust 1.4.

Я изучил WIF, который обеспечивает прямой доступ к WS Trust через WSTrustChannelFactory (см. trustChannelFactory.TrustVersion в фрагменте кода...), но кажется, что есть поддержка только для 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 на стороне клиента. реализация, но, возможно, есть более простой способ...


person Sebastian Becker    schedule 22.05.2012    source источник
comment
Вы пробовали фрагмент кода без установки TrustVersion? Возможно, пространство имен WSTrust использует WS Trust 1.4 по умолчанию, и вам нужно только установить TrustVersion для 1.3 или 2005. К сожалению, я не смог найти это задокументировано в MSDN, но я видел, что пространство имен имеет константы для WS Trust. 1.4. По крайней мере, стоит попробовать.   -  person Sixto Saez    schedule 22.05.2012
comment
Я только что заглянул внутрь реализации WIF. Расширение интерактивного запроса пользователя, определенное в WS Trust 1.4. не реализовано в WIF. Я нашел сообщение (social.msdn.microsoft.com/Forums/en-US/Geneva/thread/) от кого-то, кто столкнулся с такими же проблемами с другим расширением задачи из WS Trust 1.3. Так что в основном проблема не в настройке версии. Мне нужно расширить WIF, чтобы иметь возможность поддерживать расширение задачи...   -  person Sebastian Becker    schedule 23.05.2012
comment
Очень жаль. Похоже, что после того, как InfoCard (или как там это называлось) развалилась, Microsoft бросилась на улучшение/поддержку функций безопасности, основанных на стандартах. Я знаю, что Мишель Бустаманте, известная WCF, стала гуру безопасности, возможно, она писала о расширении WIF. :)   -  person Sixto Saez    schedule 23.05.2012


Ответы (1)


Я расширил реализацию WIF WS Trust, используя методы расширения .NET. Здесь вы можете увидеть первую часть (запрос на выпуск с RST и SAML Authn Request) в качестве примера того, как повторно использовать вещи, которые уже определены в WIF. Я использовал дизассемблер IL, чтобы увидеть, как что-то делается внутри 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;
            }
        }
person Sebastian Becker    schedule 29.05.2012