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

StackOverflow https://stackoverflow.com/questions/3578560

  •  01-10-2019
  •  | 
  •  

Вопрос

У меня есть:

  • Пассивное STS «Приложение для входа в систему», которое также является провайдером удостоверений.
  • Active STS WCF Service, которая может принять и обрабатывать токены ACTAS
  • Веб-сайт Остающая сторона
  • WCF Service Останавливая вечеринку, которая называется веб-сайтом.

Все это собрано вместе с использованием Foundation Windows Identity и Custom Code STS. Active Directory (ADFS) не участвует.

Что я работаю сейчас:

  1. Пользователь пытается посетить веб-сайт RP.
  2. Пользователь перенаправляется на пассивные STS.
  3. Пользователь входит в систему, получает выпущенный токен, перенаправляется обратно на веб-сайт RP.
  4. Веб-сайт RP делает сервисный звонок на WCF RP и передает токен ACTAS, чтобы произошла делегация.
  5. Active STS видит, что токен ACTAS входит и правильно устанавливает выходную идентичность, поэтому первичная идентичность - это токен ACTAS, а идентификация вызывающего абонента добавляется в цепочку актера.
  6. WCF RP получает правильный токен со всем на месте, текущий принцип нити имеет правильную идентичность и претензии, как следует.

Я хочу, чтобы WCF RP запросить дополнительные претензии с активных STS.

То есть в RST, который идет на Active STS, я хочу, чтобы он включил список утверждений о том, что обслуживание требует, чтобы эти дополнительные претензии могут быть получены, если они еще не присутствуют.

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

У меня есть ощущение, что он имеет отношение к привязку, которую я использую. У меня были проблемы с получением WS2007FederaterHTtpbinding, работая с токенами ACTAS и всеми примерами в WiF-идентичном комплекте, который также сделал это тоже, и он, наконец, и он, наконец, Вот фрагмент конфигурации от WCF RP, показывающий мою конфигурацию связывания:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_FederatedService">
        <security
          authenticationMode="IssuedTokenForCertificate"
          messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10">
          <issuedTokenParameters tokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
            <issuer address="http://localhost:38901/ActiveSts.svc/IWSTrust13" />
            <issuerMetadata address="http://localhost:38901/ActiveSts.svc/mex" />
          </issuedTokenParameters>
        </security>
        <textMessageEncoding>
          <readerQuotas maxArrayLength="32767" />
        </textMessageEncoding>
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>
</system.serviceModel>

Если я изменил конфиг на вызовом веб-сайте, чтобы указать требования кремени в разделе ASTEDTAKEDAKENPAMETERSES, Active STS фактически видит список необходимых претензий в RST ... Но это на вызовом веб-сайте, который проблематичен для меня.

Как мне сделать это, чтобы WCF RP может указать дополнительные претензии, которые требуется, не требуя дублирования этой конфигурации на телефонном сайте?

Если это действительно проблема привязки, это поможет, если вы сможете показать мне эквивалентную конфигурацию, учитывая то, что я получил выше. Я могу обновить веб-сайт и службу WCF с соответствующими изменениями, но, опять же, мне нужна сервис (или поведение на обслуживание или конфигурация на службе) для управления списком претензий, которые необходимо. Служба не должна принимать запросы, которые отсутствуют требуемые требования.

Это было полезно?

Решение

Оказывается, вам нужно сделать это ...

  1. Выяснить способ получить требования претензии на стороне клиента. Это может быть какой-то важный сервис конфигурации, WS-политика / обмен метаданными или все, что вам нравится.
  2. Вручную создайте запрос токена для STS. Вместо того, чтобы использовать Microsoft. WideDityModel CreateChannelActingAs(token) Метод расширения, вручную Запрашивайте токен ACTAS (или новый токен), используя WSTrustChannelFactory.
  3. Добавьте вручную запрошенный токен в параметры исходящего канала.

Обратите внимание, что это точно не удалит необходимость вашего клиента, чтобы узнать о списке требований к требованиям претензий, но он дает вам возможность каким-то образом предоставлять централизовать эту конфигурацию или даже использовать саму сервис, чтобы обеспечить этот список требований к требованиям. К сожалению, нет ничего в стеке Microsoft.identitymodel, который делает все это для вас. Клиент абсолютно должен знать список требований к требованиям претензий, поскольку запрос на токен безопасности выдается в рамках клиентской связи, не выданный сервисом, поскольку запросы на эксплуатацию обслуживания приходят.

В любом случае, вы можете увидеть приличные объяснения WSTrustChannelFactory а также WSTrustChannel На веб-сайте MSDN. Отказ Мое решение основано на этом.

Варены без всякой обработки ошибок и т. Д., Код в основном выглядит так:

// You need the channel factory so you can get info about the endpoint.
var factory = new ChannelFactory<IService>();

// Get the issuedTokenParameters information from the binding.
// You see this in the XML config but it's painful to access.
var tokenParameters = factory.Endpoint.Binding
    .CreateBindingElements()
    .OfType<SecurityBindingElement>().First()
    .EndpointSupportingTokenParameters
    .Endorsing.OfType<IssuedSecurityTokenParameters>().First();

// Prepare the RST.
var trustChannelFactory = new WSTrustChannelFactory(tokenParameters.IssuerBinding, tokenParameters.IssuerAddress);
var trustChannel = (WSTrustChannel)trustChannelFactory.CreateChannel();
var rst = new RequestSecurityToken(RequestTypes.Issue);
rst.AppliesTo = factory.Endpoint.Address;

// If you're doing delegation, set the ActAs value.
var principal = Thread.CurrentPrincipal as IClaimsPrincipal;
var bootstrapToken = principal.Identities[0].BootstrapToken;
rst.ActAs = new SecurityTokenElement(bootstrapToken);

// Here's where you can look up claims requirements dynamically.
rst.Claims.Add(new RequestClaim("http://dynamically-added-claim"));

// Get the token and attach it to the channel before making a request.
RequestSecurityTokenResponse rstr = null;
var issuedToken = trustChannel.Issue(rst, out rstr);
var fccParameters = new FederatedClientCredentialsParameters();
fccParameters.IssuedSecurityToken = issuedToken;
var channel = factory.CreateChannel();
((IChannel)channel).GetProperty<ChannelParameterCollection>().Add(fccParameters);

// NOW you can make the request.
channel.DoWork();

Это также позволяет вам кэшировать, который выпустил токен, если вы так желаете оптимизировать некоторые из коммуникаций, протекающих вокруг системы.

Предоставлено, если вы не пытаетесь динамически вставлять требования к требованиям претензий или, если вы в противном случае с удовольствием используете Confight XML и дублируете его на сервере и клиенту, это не нужно. То CreateChannelActingAs(token) Метод расширения и весь стек Microsoft.identityModel заботится об этом для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top