Как смешать конечные точки WIF и не WIF в одном WCF <service>? - PullRequest
2 голосов
/ 08 июня 2011

Службе WCF на основе WIF необходимо вызвать метод FederatedServiceCredentials.ConfigureServiceHost () или поместить эквивалентный элемент <federatedServiceHostConfiguration> в файл web.config для работы. Это настройка уровня обслуживания, другими словами, она применяется для всех конечных точек.

Согласно документации метода, экземпляр ServiceHostBase модифицируется несколькими способами, специфичными для WIF. Например, авторизация заменяется классом авторизации на основе WIF.

Теперь я хотел бы иметь один <service> (внутри <system.serviceModel><services>) с несколькими <endpoint> s, где одна конечная точка основана на WIF, а другие используют обычную проверку подлинности Windows.

Обновление. В ответ на ответ ниже позвольте мне объяснить, почему мы хотим смешивать конечные точки WIF и не-WIF. Если мы используем только WIF, то каждому из наших клиентов нужна STS, например, AD FS. Настроить это не сложно, но это препятствие, особенно если они просто хотят протестировать наше программное обеспечение. Поэтому мы делаем установку в режиме, в котором используется встроенная проверка подлинности Windows (для наших веб-служб, а также для нашего интерфейса), а затем они могут переключиться в режим, в котором используется AD FS.

Таким образом, в основном мы хотим иметь возможность установки без AD FS, чтобы снизить барьер для входа в наше приложение.

Для этого <service> требуется <federatedServiceHostConfiguration>. Однако - и вот моя проблема - это влияет и на конечные точки не-WIF для той же службы: например, они неожиданно используют диспетчер авторизации WIF (экземпляр class ClaimsAuthorizationManager).

Итак, мой вопрос: каков рекомендуемый способ смешивания конечных точек WIF и не WIF в одном WCF <service>?

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

Возможно, вы путаете использование WIF с использованием STS.Они не связаны.

WS2007FederationHttpBinding приведет к тому, что конечная точка WCF будет ожидать выданного токена (от STS).WS2007HttpBinding или NetTcpBinding может потребовать токен Windows.

Вы можете использовать WIF для обработки обоих, на самом деле именно с WIF вы можете иметь поведение службы, которое более эффективно поддерживает два различных формата токенов.

Выпущенная конечная точка токена будет полагаться на конфигурацию для обработчика токена безопасности saml11 / saml2 в конфигурации WIF для обработки токена и раздела доверенного эмитента для установления доверия к этому токену.Конечная точка Windows будет полагаться на один из обработчиков токенов безопасности Windows для обработки токена Windows.

Оба будут проходить через диспетчер проверки подлинности службы WIF, но будут обрабатывать заявки на Windows или на выданный токен.Вы можете использоватьRSAUthenticationManager для преобразования этих утверждений до того, как они перейдут в диспетчер утверждений для авторизации доступа.

Существует множество способов обрезки этого кота, но это определенно возможно.

2 голосов
/ 09 июня 2011

Не думаю, что ты можешь. Тем не менее, в вашей ситуации у вас должна быть только одна конечная точка WIF, предоставляющая STS поддержку нескольких учетных данных.

Вы можете разместить несколько конечных точек на своей STS для обработки разных типов аутентификации. Один для Windows, один для имени пользователя / пароля, например.

В прошлом году я проводил сессию код-лагеря, которая продемонстрировала это. Источник прикреплен к моему сообщению в блоге по адресу http://www.neovolve.com/post/2010/11/21/CodeCampOz-Not-a-WIF-of-federation.aspx. Посмотрите файл web.config в NotAWif Demo \ 4 - Делегирование удостоверений \ NotAWif.DelegationSTS .

<system.serviceModel>
  <services>
    <service behaviorConfiguration="ServiceBehavior"
                    name="Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract">

      <endpoint address="UserName/IWSTrust13"
                        binding="ws2007HttpBinding"
                        bindingConfiguration="ws2007HttpBindingUserNameConfiguration"
                        contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />

      <endpoint address="Windows/IWSTrust13"
                binding="ws2007HttpBinding"
                bindingConfiguration="ws2007HttpBindingWindowsConfiguration"
                contract="Microsoft.IdentityModel.Protocols.WSTrust.IWSTrust13SyncContract" />

      <endpoint address="mex"
                        binding="mexHttpsBinding"
                        contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="https://localhost/NotAWif.DelegationSTS/Service.svc" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <bindings>
    <ws2007HttpBinding>
      <binding name="ws2007HttpBindingUserNameConfiguration">
        <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="None">
            <extendedProtectionPolicy policyEnforcement="Never" />
          </transport>
          <message clientCredentialType="UserName"
                                establishSecurityContext="false" />
        </security>
      </binding>
      <binding name="ws2007HttpBindingWindowsConfiguration">
        <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="None">
            <extendedProtectionPolicy policyEnforcement="Never" />
          </transport>
          <message clientCredentialType="Windows"
                                establishSecurityContext="false" />
        </security>
      </binding>
    </ws2007HttpBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
        <serviceCredentials>
          <serviceCertificate findValue="DefaultApplicationCertificate"
                                          x509FindType="FindBySubjectName" />
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Так я настроил STS для поддержки нескольких типов аутентификации. RP должен иметь дело только с претензиями, а не с претензиями | WindowsIdentity. STS несет ответственность за преобразование определенного типа аутентификации в набор утверждений, которые будет использовать RP.

...