Использование маркеров, назначенных службой маркеров безопасности, для вызова службы WCF

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

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

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

Подробности. Не удалось обработать сообщение. Скорее всего, это связано с тем, что действие «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>


Service side:

<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>

Sorry for the massive pastes but hopefully someone can spot my error! Am I just approaching it the wrong way?


person Henry    schedule 11.03.2011    source источник


Ответы (3)


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

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

Конфигурация должна быть установлена ​​в:

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

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

<securityTokenHandlerConfiguration saveBootstrapTokens="true" /> 
person JML    schedule 21.03.2011

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

person Miguel Merayo Regueras    schedule 17.03.2011
comment
Если это сработает, я построю храм в честь тебя. - person Henry; 17.03.2011
comment
Если это хороший ответ, просто отметьте его как правильный, вам не нужно строить для меня храм. ржу не могу - person Miguel Merayo Regueras; 20.03.2011

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

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

person Eugenio Pace    schedule 15.03.2011
comment
Спасибо за ваш ответ! Я также пытался сделать то же самое с доступом к RP-STS, и у меня все еще очень похожие проблемы. Любые указатели? Я действительно застрял с этим. - person Henry; 16.03.2011
comment
извините, я не уверен на 100%, что понимаю. Какие у вас проблемы с RP-STS? - person Eugenio Pace; 16.03.2011
comment
Думая о том, что вы сказали, я увидел ошибочность своего пути. У RP-STS также есть службы, к которым необходимо получить доступ, и поскольку он зависит от IP, любые запросы немедленно возвращаются к IP (что, очевидно, просто возвращает HTML, и я это знал). В настоящее время проект уже разделен на доменный проект, поэтому мне просто нужно создать новый проект веб-службы, который вместо этого зависит от RP, и поэтому токен будет действительным. Или, по крайней мере, из того, что я могу выяснить. Хотя ничто из этого не объясняет, почему место на карточке все время всплывает! Надеюсь, это больше не повторится. - person Henry; 16.03.2011