App.Config для Federated Security с сертификатом клиента в Thinktecture IdentityServer

В настоящее время я могу установить канал WCF с IssuedToken, сначала установив маркер безопасности из STS с учетными данными сертификата через конечную точку WS-Trust, а затем вызвав CreateChannelWithIssuedToken() на фабрике каналов. См. Как указать сертификат в качестве учетных данных для wsTrustChannel с Thinktecture IdentityServer

Однако вместо этого:

var securityToken = GetMeASecurityTokenFromTheSts();
var myServiceChannelFactory = new ChannelFactory<IMyService>();
myServiceChannelFactory.CreateChannelWithIssuedToken(securityToken);

В идеале я хотел бы просто сделать это (и чтобы эмитент токена безопасности автоматически выдавал токен на основе переданного сертификата).

var myClient = new MyServiceClient();

У меня вопрос: можно ли настроить привязку следующим образом, чтобы указать, что ThinkTecture IdentityServer STS является эмитентом маркеров безопасности?

<bindings>
  <ws2007FederationHttpBinding>
    <binding name="WS2007FederationHttpBinding">
      <security mode="TransportWithMessageCredential">
        <message issuedKeyType="BearerKey" issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0">
          <issuer address="https://mymachine/myidserver/issue/wstrust/mixed/certificate">
            <identity>
              <certificateReference storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="XXXXXXXXXXXXXXXXXXXXXXXXX"/>
            </identity>
          </issuer>
          <issuerMetadata address="https://mymachine/myidserver/FederationMetadata/2007-06/FederationMetadata.xml" />
          <tokenRequestParameters>
            <trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
              <trust:TokenType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0</trust:TokenType>
              <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:Claims Dialect="http://schemas.xmlsoap.org/ws/2005/05/identity"
                xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                <wsid:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
                  xmlns:wsid="http://schemas.xmlsoap.org/ws/2005/05/identity" />
              </trust:Claims>
              <trust:CanonicalizationAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/10/xml-exc-c14n#</trust:CanonicalizationAlgorithm>
              <trust:EncryptionAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/04/xmlenc#aes256-cbc</trust:EncryptionAlgorithm>
            </trust:SecondaryParameters>
          </tokenRequestParameters>
        </message>
      </security>
    </binding>
  </ws2007FederationHttpBinding>
</bindings>

если так - у меня много проблем с настройкой этой части привязки:

<issuer address="https://mymachine/myidserver/issue/wstrust/mixed/certificate">
    <identity>
        <certificateReference storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="XXXXXXXXXXXXXXXXXXXXXXXXX"/>
    </identity>
</issuer>

Моя основная область путаницы заключается в следующем: элемент конфигурации эмитента, похоже, инкапсулирует привязку, поведение и конечную точку в одном элементе. Привязку можно настроить, и это явно необходимо, поскольку вышеприведенный элемент эмитента жалуется на то, что привязка не настроена. Но как указать SSL-сертификат для канала эмитента, поскольку это вопрос конфигурации поведения, и, похоже, нет никакого способа установить поведение для конечной точки эмитента.


person Clint    schedule 17.03.2014    source источник


Ответы (2)


Использование подхода только с конфигурацией действительно имеет проблему привязки времени жизни токена к времени жизни прокси. Кроме того, область (appliesTo), которую вы настраиваете в IdentityServer, должна соответствовать физическому URL-адресу службы WCF. И то и другое IMO непрактично, и гораздо более рекомендуется «ручной» подход WSTrustChannelFactory.

Тем не менее, svcutil (или «Добавить ссылку на службу») создает для вас всю необходимую конфигурацию клиента. Вам просто нужно убедиться, что вы указываете на конечную точку MEX IdentityServer в конфигурации службы WCF, например:

<bindings>
      <ws2007FederationHttpBinding>
        <binding>
          <security mode="TransportWithMessageCredential">
            <message establishSecurityContext="false"
                     issuedKeyType="BearerKey">
              <issuerMetadata address="https://identity.thinktecture.com/idsrvsample/issue/wstrust/mex" />
            </message>
          </security>
        </binding>
      </ws2007FederationHttpBinding>
    </bindings>

https://github.com/thinktecture/Thinktecture.IdentityServer.v2/blob/master/samples/MVC%20and%20WCF%20RP%20(SAML)/Web/Web.config

... и проблема с MEF исправлена, кстати.

person leastprivilege    schedule 17.03.2014
comment
Аааа, большое спасибо, Доминик, это отличный ответ, потому что он подтверждает мои подозрения о некоторых недостатках автоматического подключения к STS для привязки ws2007FederationHttpBinding. Это также подтверждает, что в моем случае мне придется использовать ручной подход WSTrustChannelFactory, поскольку я аутентифицирую серверный процесс, у которого нет физического URL-адреса. - person Clint; 19.03.2014

Вы можете установить конфигурацию привязки для эмитента. Использование сертификата будет установлено в поведении MyServiceClient. Я не тестировал эту конфигурацию, но она может работать.

Вот ваша измененная конфигурация

<bindings>
    <ws2007FederationHttpBinding>
        <binding name="WS2007FederationHttpBinding">
            <security mode="TransportWithMessageCredential">
                <message issuedKeyType="BearerKey" issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0">
                    <issuer address="https://mymachine/myidserver/issue/wstrust/mixed/certificate" binding="ws2007HttpBinding" 
                  bindingConfiguration="issuerBindingConfig">
                    </issuer>
                    <issuerMetadata address="https://mymachine/myidserver/FederationMetadata/2007-06/FederationMetadata.xml" />
                    <tokenRequestParameters>
                        <trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                            <trust:TokenType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0</trust:TokenType>
                            <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:Claims Dialect="http://schemas.xmlsoap.org/ws/2005/05/identity"
            xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                                <wsid:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
              xmlns:wsid="http://schemas.xmlsoap.org/ws/2005/05/identity" />
                            </trust:Claims>
                            <trust:CanonicalizationAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/10/xml-exc-c14n#</trust:CanonicalizationAlgorithm>
                            <trust:EncryptionAlgorithm xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://www.w3.org/2001/04/xmlenc#aes256-cbc</trust:EncryptionAlgorithm>
                        </trust:SecondaryParameters>
                    </tokenRequestParameters>
                </message>
            </security>
        </binding>
    </ws2007FederationHttpBinding>

    <ws2007HttpBinding>
        <!--SWACA RAWS Client authentication binding-->
        <binding name="issuerBindingConfig">
            <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="None" />
                <message clientCredentialType="Certificate" establishSecurityContext="false" />
            </security>
        </binding>
    </ws2007HttpBinding>
</bindings>


<endpointBehaviors>
    <behavior name="MyServiceClient">
        <clientCredentials supportInteractive="false">
            <clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="XXXXXXXXXXXXXXXXXXXXXXXXX" />
        </clientCredentials>
    </behavior>
</endpointBehaviors>

Однако имейте в виду, что если вы сделаете это, то каждый new MyServiceClient() будет практически запрашивать токен у STS. Когда мы использовали этот подход в нашей системе, у нас были некоторые потокобезопасность MEF с Сервер идентификации.

person pepo    schedule 17.03.2014