使用 WIF 令牌保护的 WCF 服务需要公共方法

Posted

技术标签:

【中文标题】使用 WIF 令牌保护的 WCF 服务需要公共方法【英文标题】:WCF service secured with WIF token needs public method 【发布时间】:2012-12-05 20:34:41 【问题描述】:

我有一个 WCF 服务托管在 <ws2007FederationHttpBinding> 的单个端点上。该服务使用 WIF 令牌进行保护。

服务有一种方法void IsOnline() 来确定服务的可用性。此方法必须可以在没有令牌的情况下调用,并且我不能拆分接口,也不能添加另一个不安全的端点。 (=配置服务限制)

那么,我可以将我的绑定修改为基本上声明“使用 WIF 令牌是可选的”吗?或者换句话说:服务应该使用调用者的声明和身份,或者如果没有提供令牌,则使用某种匿名令牌。

我当前的绑定:

  <microsoft.identityModel>
    <service saveBootstrapTokens="true">
      <audienceUris>
        <add value="https://.../MyServiceCaller" />
      </audienceUris>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" issuer="https://.../MyFederationProviderHere" realm="https://.../MyServiceCaller" requireHttps="true" />
        <cookieHandler requireSsl="true" />
      </federatedAuthentication>
      <applicationService>
        <claimTypeRequired>
          <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" />
          <claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" />
        </claimTypeRequired>
      </applicationService>
      <serviceCertificate>
        <certificateReference x509FindType="FindByThumbprint" findValue="123123" />
      </serviceCertificate>
      <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
        <trustedIssuers>
          <add thumbprint="123123" name="My.Auth.FederationProvider" />
          <add thumbprint="456456" name="My.Auth.FederationProvider" />
        </trustedIssuers>
      </issuerNameRegistry>
    </service>
  </microsoft.identityModel>
    ...
  <ws2007FederationHttpBinding>
    <binding name="Host_Ws2007FederationHttp_WithToken">
      <security>
        <message establishSecurityContext="false" issuedKeyType="BearerKey"
            issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"
            negotiateServiceCredential="false">
          <tokenRequestParameters>
            <trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
              <trust:TokenType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</trust:TokenType>
              <trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
            </trust:SecondaryParameters>
          </tokenRequestParameters>
        </message>
      </security>
    </binding>
  </ws2007FederationHttpBinding>

【问题讨论】:

能否分享一下服务配置 其实我不能。该服务由配置服务动态创建(在 stocktraider 示例中发布)。 【参考方案1】:

否 - 在 WCF 中,身份验证要求是针对每个端点的。您的 IsOnline 操作需要一个单独的端点。然后,您在此端点上使用允许匿名连接的绑定。

【讨论】:

我认为你是对的。我使用另一个 STS 解决了这个问题,该 STS 为我的 IsOnline 方法提供了一个具有有限优先权的令牌。谢谢。

以上是关于使用 WIF 令牌保护的 WCF 服务需要公共方法的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明

使用 ADFS2 作为 IP 使用 WIF 保护后端 WCF 服务

如何将(声明)安全令牌传递给启用 WIF 的 WCF 服务?

在使用 WIF/Geneva 的应用程序中处理使用 WCF 服务的凭据

在不使用 WIFI 的情况下在 WCF 服务调用中包含 SAML 2.0 令牌

如何使用 Microsoft JWT 令牌处理程序来保护基于 webHttpBinding 的 WCF 服务