Использование токенов, назначенных из STS, для вызова службы WCF - PullRequest
7 голосов
/ 11 марта 2011

Я смотрел на это весь день безрезультатно, и у меня нет идей.IP-STS обрабатывает логин, затем передает его RP-STS, который заполняет токен заявками, а затем на веб-сайт.это работает правильно.У меня есть некоторые функции WCF на IP-STS, такие как изменение пароля / сброс пароля, и мне нужен доступ к ним.После прочтения I должна быть в состоянии отправить токен, уже назначенный через WCF, чтобы убедиться, что пользователь аутентифицирован.Из того, что я вижу, это отправка токена, но не правильно, а также не так, как я хочу, поскольку в данный момент мне нужно имя пользователя.

В идеале Я хочу, чтобывозьмите токен, назначенный пользователю, и вам не придется повторно запрашивать или заново создавать что-либо, и определенно нет необходимости в имени пользователя / пароле.

В настоящее время я получаю сообщение об ошибке: AnНеобеспеченная или неправильно обеспеченная ошибка была получена от другой стороны.См. Внутреннее исключение FaultException для получения кода ошибки и подробностей.

Detail: Сообщение не может быть обработано.Скорее всего, это связано с тем, что действие 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue' является неправильным, или потому что сообщение содержит недопустимый токен или токен контекста безопасности с истекшим сроком действия или из-за несоответствия между привязками.Маркер контекста безопасности будет недействительным, если служба прервет канал из-за неактивности.Чтобы предотвратить прерывание бездействующими сеансами службы преждевременно, увеличьте время ожидания приема для привязки конечной точки службы.

Здесь приведены соответствующие биты из моих веб-конфигураций.

на стороне клиента web.config


<system.serviceModel>
<bindings>
  <customBinding>
    <binding name="UsernameBinding">          <security authenticationMode="UserNameForCertificate"                  requireSecurityContextCancellation ="false"                  requireSignatureConfirmation="false"                  messageProtectionOrder ="SignBeforeEncryptAndEncryptSignature"                  requireDerivedKeys="true">
      </security>
      <httpTransport/>
    </binding>
  </customBinding>
  <wsFederationHttpBinding>
    <binding name="HTTPEndpoint" closeTimeout="00:10:00" openTimeout="00:10:00"
      receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false"
      transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
      textEncoding="utf-8" useDefaultWebProxy="true">
      <security mode="Message">
        <message issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"   negotiateServiceCredential="false">              <claimTypeRequirements>

            <add claimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" isOptional="false" />
          </claimTypeRequirements>

          <issuer address="http://localhost:13422/MembershipService" bindingConfiguration="UsernameBinding" binding="customBinding">
            <identity>
              <certificateReference findValue="STSTestCert" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="TrustedPeople" />
            </identity>
          </issuer>
        </message>

      </security>
    </binding>
  </wsFederationHttpBinding>
</bindings>

<behaviors>
  <!-- Credentials configuration -->
  <endpointBehaviors>
    <behavior name="ServiceBehavior">
      <clientCredentials>

        <clientCertificate findValue="STSTestCert" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName" />
        <serviceCertificate>
          <defaultCertificate findValue="STSTestCert" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
          <authentication certificateValidationMode="PeerOrChainTrust"  />
        </serviceCertificate>

      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

<client>
  <endpoint address="http://localhost:13422/MembershipService"
    binding="wsFederationHttpBinding" bindingConfiguration="HTTPEndpoint"
    contract="MembershipService.IAccountMembershipService" name="HTTPEndpoint" behaviorConfiguration="ServiceBehavior">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
</client>


Служебная сторона:

<system.serviceModel>

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true">
  <serviceActivations>
    <add relativeAddress="IAccountMembershipService.svc" service="AccountMembershipService" factory="System.ServiceModel.Activation.WebServiceHostFactory" />
  </serviceActivations>
</serviceHostingEnvironment>

<bindings>
  <wsHttpBinding>
    <binding name="federationBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00">

      <security mode="Message">
        <message negotiateServiceCredential="true" />
      </security>
    </binding>

  </wsHttpBinding>
  <wsFederationHttpBinding>
    <binding name="federationBinding" closeTimeout="00:10:00" openTimeout="00:10:00"
      receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false"
      transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
      textEncoding="utf-8" useDefaultWebProxy="true">

      <security mode="Message">
        <message issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" negotiateServiceCredential="false">
          <claimTypeRequirements>

            <add claimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" isOptional="false" />
          </claimTypeRequirements>

          <issuer address="http://localhost:13422/MembershipService" bindingConfiguration="UsernameBinding" binding="customBinding">
            <identity>
              <certificateReference findValue="STSTestCert" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="TrustedPeople" />
            </identity>
          </issuer>
        </message>
      </security>
    </binding>
  </wsFederationHttpBinding>
</bindings>


<behaviors>
  <serviceBehaviors>
    <behavior name="serviceBehavior">
      <serviceMetadata httpGetEnabled="true" />

      <serviceCredentials>
        <serviceCertificate findValue="CN=STSTestCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName"/>

      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

<extensions>
  <behaviorExtensions>
    <!-- This behavior extension will enable the service host to be Claims aware -->
    <add name="federatedServiceHostConfiguration" type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=0.6.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </behaviorExtensions>
</extensions>

<services>
  <service behaviorConfiguration="serviceBehavior" name="STS.IP.Models.AccountMembershipService">
    <endpoint binding="wsFederationHttpBinding" bindingConfiguration="federationBinding" name="HTTPEndpoint" contract="STS.IP.Infrastructure.IAccountMembershipService" >
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <!-- <endpoint binding="wsHttpBinding" bindingConfiguration="" name="HTTPEndpoint" contract="Aurora.WCFIsAlive.IIsAlive" />-->

  </service>
</services>

Извините за массивные пасты, но, надеюсь, кто-то может заметить мою ошибку!Я просто подхожу к этому неправильно?

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Не знаю, поможет ли это, но это может быть немного связано ... Вы можете повторно использовать выданный токен, это было то, что я делал раньше. У меня был такой сценарий: сайт ASP.NET или служба WCF были защищены WIF, но затем сайту ASP.NET или службе WCF нужно было вызвать другую службу, для которой требовались токены SAML / WIF и т. Д. Вы можете повторно использовать токен, если установите WIF для использования начальной загрузки. Пока 2-й веб-сервис доверяет одному и тому же STS.

http://msdn.microsoft.com/en-us/library/ee517256.aspx#_bootstrap

Конфигурация устанавливается в:

<microsoft.IdentityModel><service><securityTokenHandlers>: 

это значение:

<securityTokenHandlerConfiguration saveBootstrapTokens="true" /> 
2 голосов
/ 17 марта 2011

пространство карты все время всплывало ... client.ClientCredentials.SupportInteractive = false;

1 голос
/ 15 марта 2011

Веб-сайт (эта проверяющая сторона, которая работает сейчас) и конечная точка WCF на IP-STS - это 2 разных приложения.Вы не можете использовать один и тот же токен.Вы должны получить новый токен для служб IP-STS (например, обновить пароль и т. Д.)

В этом случае службы IP-STS концептуально являются просто другой проверяющей стороной (которая, вероятно, доверяет себе).

...