【问题标题】:How do I change my WCF's FederationMetadata.xml file for various deployments?如何为各种部署更改我的 WCF 的 FederationMetadata.xml 文件?
【发布时间】:2011-11-30 19:42:27
【问题描述】:

我们有一个 ADFS 2.0 安装,它在我们的各种环境中都适用于我们的 MVC 应用程序。我相信它使用“被动身份验证”(我仍在习惯正确的术语) - 如果用户未登录,它肯定会将用户重定向到我们的 adfs 代理,并且 adfs 将用户重定向回我们的 MVC 应用程序一旦他们登录。

我们现在开始公开一些安全的 Web 服务,并希望利用相同的身份验证系统。我的理解是我想使用ws2007FederationHttpBinding 作为我的绑定来执行此操作。我相信我已经为此设置了我的 WCF 的 web.config,但我的斗争现在集中在 FederationMetadata.xml 文件上。

查看这个文件,我看到一些明显需要更改的东西,例如entityID="http://localhost/UserServices" 和证书。然后有一些我不知道它们是什么以及是否需要更改的东西,例如EntityDescriptor ID="_2b510fe8-98b8......<ds:SignatureValue>CZe5mEu19/bDNoZrY8f6C559CJ.......

我在哪里可以更好地了解我应该如何为我的各种环境管理此文件?我有以下环境托管这些服务,我们将以一种或另一种方式部署这些服务:

  1. 个人开发者工作站(目前是 3 倍,以后会更多)
  2. 一个共享的开发环境,供人们针对这些服务编写应用程序,但不一定要修改服务
  3. 质量检查
  4. 分期
  5. 生产(具有不同证书/域/等的 3 个不同环境)

因此,我们有一个相当简化的流程来管理不同环境中的 web.config 文件,使用转换和查找/替换某些令牌,所以我想对这个 xml 文件做同样的事情。因此,最终,我所寻求的只是了解在为我的各种环境管理此 FederationMetadata.xml 文件时需要进行哪些更改。

我当前的 FederationMetadata.base.xml 文件在下面,我相信这是正确的(我只需要名称/角色),我只需要智能地替换各种标记,例如 ~RootServiceUrlTokenToReplace~,在这里:

<?xml version="1.0" encoding="utf-8"?>
<EntityDescriptor ID="~EntityDescriptorIdTokenToReplace~" entityID="http://~RootServiceUrlTokenToReplace~" xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
      <ds:Reference URI="#~ReferenceURITokenToReplace~">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
        <ds:DigestValue>~DigestValueTokenToReplace~</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>~SignatureValueTokenToReplace~</ds:SignatureValue>
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <X509Data>
        <X509Certificate>~CertificateTokenToReplace~</X509Certificate>
      </X509Data>
    </KeyInfo>
  </ds:Signature>
  <RoleDescriptor xsi:type="fed:ApplicationServiceType" protocolSupportEnumeration="http://schemas.xmlsoap.org/ws/2005/02/trust http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fed="http://docs.oasis-open.org/wsfed/federation/200706">
    <KeyDescriptor use="encryption">
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <X509Data>
          <X509Certificate>~CertificateTokenToReplace~</X509Certificate>
        </X509Data>
      </KeyInfo>
    </KeyDescriptor>
    <fed:ClaimTypesRequested>
      <auth:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" Optional="true" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706" />
      <auth:ClaimType Uri="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" Optional="true" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706" />
    </fed:ClaimTypesRequested>
    <fed:TargetScopes>
      <EndpointReference xmlns="http://www.w3.org/2005/08/addressing">
        <Address>http://~RootServiceUrlTokenToReplace~</Address>
      </EndpointReference>
    </fed:TargetScopes>
    <fed:ApplicationServiceEndpoint>
      <EndpointReference xmlns="http://www.w3.org/2005/08/addressing">
        <Address>http://~RootServiceUrlTokenToReplace~</Address>
      </EndpointReference>
    </fed:ApplicationServiceEndpoint>
  </RoleDescriptor>
</EntityDescriptor>

【问题讨论】:

    标签: wcf web-services adfs2.0 federated-identity


    【解决方案1】:

    我找到了问题in this blog post 的部分答案。我正在研究它以发现这是否回答了我所有的问题。我刚找到它。显然,当我将其重新部署到不同的环境时,我确实需要更改我的 EntityID(包含 URL),但 SignatureValue 包含该 URL 的哈希(除其他外?)所以通过修改 URL,我使 SignatureValue 无效并且它需要被再生。显然这个FederationMetadata Generator 可以帮助我解决这个问题。

    【讨论】:

      【解决方案2】:

      基于 WIF 的应用程序的 FederationMetadata.xml 与其提供的基于声明的 Web 服务无关。

      (指向的 URL)FederationMetadata.xml 由 AD FS 使用,以自动更新要在信赖方信任中使用的信息。例如,AD FS 可以定期查询此 URL,并相应地更新依赖方信任信息。

      有关 Web 服务的信息(基于声明或其他),即其元数据,作为 WSDL 文档发布。在基于 WCF 的服务中,这是一个通常如下所示的 URL:http://myhost.example.com/appName/serviceName.svc?wsdl。该 WSDL 文档通常不作为物理文件存在,而是由 WCF 自动生成。

      【讨论】:

      • 是的,我知道这与 WSDL 无关。然而,这与环境有很大关系。最初渲染的 FederationMetadata.xml 中有多次“localhost”,这显然是错误的,需要针对每个不同的部署位置进行更改。我不知道将其中的一些更改为什么,例如 EntityDescriptor ID 或 SignatureValue。这就是我需要帮助理解的内容。
      • 您似乎希望使用 WIF 和 AD FS 保护 WCF Web 服务。我的意思很简单,您不需要FederationMetadata.xml:该文件不用于任何Web 服务通信。您不妨从您的应用程序中删除此文件,一切仍然有效。
      • 这样做意味着我必须使用 ADFS 2.0 手动配置所有内容,而不是让 XML 配置它,对吗?它仍然可以作为 RP 正常工作吗?如果是这样,那么,那真的只会在其他地方出现同样的问题。所以现在,我想,我需要知道如何在 ADFS 管理工具中手动配置 RP。
      • 正确。而且您已经在 AD FS 2.0 中为您的 web 应用程序的 UI 提供了一个 RPT,对吧?现在,如果您开始使用 WCF,如果您的应用程序的 UI 部分已经工作,AD FS 2.0 中的配置不会更改。在 web.config 中,只需将 WCF 绑定(服务?不记得手头)指向具有相同依赖方标识符的相同 AD FS 2.0 实例,然后您的 Web 服务和您的 Web 应用程序 UI 将使用相同的 RPT .
      • 但是对于 ASP.NET,它是被动联合,而对于 WCF,它是主动联合。我不需要以不同的方式配置 RP 吗?还是我误解了那里的东西......
      猜你喜欢
      • 2018-10-05
      • 2014-03-14
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多