2

基于 WIF 的 WCF 服务需要调用方法FederatedServiceCredentials.ConfigureServiceHost()或将等效元素<federatedServiceHostConfiguration>放入web.config文件中才能工作。这是服务级别的设置,换句话说,它适用于所有端点。

根据方法文档,该ServiceHostBase实例以几种特定于 WIF 的方式进行了修改。例如,授权被基于 WIF 的授权类替换。

现在我想要一个<service>(内部<system.serviceModel><services>)和多个<endpoint>s,其中一个端点是基于 WIF 的,其他端点使用普通的 Windows 身份验证。

更新。 针对下面的答案,让我解释一下为什么我们要混合使用 WIF 和非 WIF 端点。如果我们只使用 WIF,那么我们的每个客户都需要一个 STS,比如 AD FS。设置它并不难,但它是一个障碍,特别是如果他们只是想试驾我们的软件。所以我们要做的是在使用 Windows 集成身份验证的模式下安装(对于我们的 Web 服务,也对于我们的前端),然后他们可以切换到使用 AD FS 的模式。

所以基本上我们希望能够在没有 AD FS 的情况下进行安装,以降低应用程序的进入门槛。

为此,<service>需要一个<federatedServiceHostConfiguration>. 但是——这是我的问题——这也会影响同一服务的非 WIF 端点:例如,它们突然使用 WIF 授权管理器(ClaimsAuthorizationManager的一个实例)。

所以我的问题是:在单个 WCF 中混合 WIF 和非 WIF 端点的推荐方法是什么<service>

4

2 回答 2

2

我不认为你可以。但是,在您的情况下,您应该只有一个 WIF 端点将多凭证支持留给 STS。

您可以在 STS 上放置多个端点来处理不同类型的身份验证。例如,一种用于 Windows,一种用于用户名/密码。

去年我做了一个代码营 oz 会议来证明这一点。来源附在我的博客文章http://www.neovolve.com/post/2010/11/21/CodeCampOz-Not-a-WIF-of-federation.aspx上。查看NotAWif Demo\4 - Identity Delegation\NotAWif.DelegationSTS中的 web.config 。

<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 将使用的一组声明。

于 2011-06-08T23:22:30.060 回答
2

您可能会混淆使用 WIF 和使用 STS。它们不相关。

WS2007FederationHttpBinding 将导致 WCF 端点期待一个颁发的令牌(来自 STS)。WS2007HttpBinding 或 NetTcpBinding 可能需要 Windows 令牌。

您可以使用 WIF 来处理这两者,事实上,您可以使用 WIF 来更有效地支持两种不同的令牌格式的服务行为。

颁发的令牌端点将依赖于 WIF 配置中 saml11/saml2 安全令牌处理程序的配置来处理令牌和受信任的颁发者部分以建立对该令牌的信任。windows 端点将依赖 windows 安全令牌处理程序之一来处理 windows 令牌。

两者都将通过 WIF 服务 authz 管理器汇集,但会为 windows 或您的已发行令牌提供水合索赔。您可以使用 claimAUthenticationManager 在到达 claimauthorizationmanager 以授权访问之前转换这些声明。

有很多方法可以给这只猫剥皮,但这绝对是可能的。

于 2011-08-06T21:41:55.923 回答