Настраиваемая привязка WCF, которая будет поддерживать HTTPS, подписанный сертификат и подписанный токен имени пользователя.

Я попытался задать этот вопрос о WCF, но у меня нет ответов, поэтому я пытаюсь еще раз задать более конкретный вопрос.

Может ли кто-нибудь сказать мне, как создать пользовательскую привязку для клиента WCF, которая будет:

  • включить подписанный токен имени пользователя
  • включить подписанное сообщение
  • быть отправлено по HTTPS

ОБНОВИТЬ

Не уверен, что это имеет значение, но я использую .NET 4.

ДРУГОЕ ОБНОВЛЕНИЕ

Если у кого-то есть конкретные примеры, было бы здорово


person Phil Hale    schedule 17.08.2011    source источник
comment
Это не ответ, но я наткнулся на полезную утилиту, [msdn.microsoft.com/en-us/library/ms732009.aspx] (инструмент редактирования конфигурации), который имеет графический интерфейс и мастера для создания/редактирования конфигураций WCF.   -  person Phil Hale    schedule 24.08.2011


Ответы (1)


Думаю, я могу дать несколько советов. Вам нужно будет использовать WIF, чтобы заставить это работать. Токен имени пользователя, который вы хотите передать, будет подписанным токеном SAML. Чтобы сгенерировать токен SAML, существует пример проекта STS, который поставляется с образцом WCF, вы можете использовать этот пример проекта. Ваш код должен выглядеть примерно так:

            //This class will use the STS WCF sample to generate the signed SAML token
            var tm = new TokenManager();
            var samlToken = tm.GetSamlToken(Username);
            var cf2 = new ChannelFactory<IPingService>("WcfSamlOverMutualSsl");
            cf2.Credentials.ClientCertificate.Certificate = clientCert;

            cf2.ConfigureChannelFactory();

            cf2.Open();
            // this code will attach the SAML token to WCF service.
            var proxy2 = cf2.CreateChannelWithIssuedToken(samlToken);
            response = proxy2.Ping();

Конфиг должен выглядеть примерно так:

<customBinding>
        <binding name="SamlOverMutualSsl">
          <security defaultAlgorithmSuite="Default" authenticationMode="IssuedTokenOverTransport"
              requireDerivedKeys="true" securityHeaderLayout="Strict" includeTimestamp="false"
              keyEntropyMode="CombinedEntropy" messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10">
            <issuedTokenParameters keyType="BearerKey" tokenType="">
              <additionalRequestParameters>
                <trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                  <trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
                </trust:SecondaryParameters>
              </additionalRequestParameters>
            </issuedTokenParameters>
            <localClientSettings cacheCookies="true" detectReplays="false"
                replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
                replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
                sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
                timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
            <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00"
                maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
                negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
                sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
                reconnectTransportOnFailure="true" maxPendingSessions="128"
                maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
            <secureConversationBootstrap />
          </security>
          <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
              messageVersion="Soap11" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </textMessageEncoding>
          <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
              maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
              bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
              keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
              realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
              useDefaultWebProxy="true" requireClientCertificate="true" />
        </binding>
      </customBinding>

Конечная точка:

<endpoint address="https://localhost/Ping/saml"
          binding="customBinding" bindingConfiguration="SamlOverMutualSsl"
          contract="SharedContracts.IPingService" name="WcfSamlOverMutualSsl" />

Пожалуйста, добавьте ссылку на Microsoft.IdentityModel из WIF.

person rauts    schedule 17.08.2011
comment
К сожалению, я не могу найти ссылку на Microsoft.IdentityModel. Что мне не хватает? - person Phil Hale; 17.08.2011
comment
Вам нужно будет установить Microsoft Windows Indentity Foundation (WIF), чтобы получить ссылку - person rauts; 17.08.2011
comment
Не могли бы вы указать мне конкретный пример, из которого вы получили этот код, пожалуйста? Я скачал эти примеры, но не могу найти соответствующий код - person Phil Hale; 17.08.2011
comment
образец кода, который я вставил, не взят ни из одного образца. я только что дал вам представление о том, как должен выглядеть ваш код. - person rauts; 17.08.2011
comment
Справедливо. К сожалению, мои знания WCF ужасны, поэтому я изо всех сил пытаюсь превратить это в рабочий код. - person Phil Hale; 17.08.2011