【问题标题】:Active and Passive Federation in WIFWIF 中的主动和被动联合
【发布时间】:2016-04-09 20:07:17
【问题描述】:

我试图了解 WIF 中主动和被动联合之间的区别。如果依赖方 (RP) 是 WCF 服务而不是 ASP.NET 应用程序,则似乎使用主动联合;如果 RP 是 ASP.NET 应用程序,则使用被动联合。这准确吗?

因此,在 ASP.NET 应用程序在后端使用 WCF 的情况下,MS 文章建议使用 ASP.NET 应用程序使用 ActAs STS 获得的“引导”安全令牌,该令牌是用于向 WCF 进行身份验证。在这种情况下,我们似乎正在组合 Active (user -> STS -> ASP.NET RP) 和 Passive (ASP.NET -> ActAs STS -> WCF) Federation?

【问题讨论】:

    标签: wif


    【解决方案1】:

    Active Federation 是关于使用 WSTrust 协议对用户进行身份验证,而您的依赖方是拥有登录窗口并向 STS 请求安全令牌的人。 被动联合是指依赖方没有登录逻辑并且您被重定向到位于 STS 上的登录页面。在我看来,Active Federation 的配置更复杂(我正在使用 silverlight,所以它需要一些技巧)。我打算在我的博客上发布关于这个主题的帖子,因为互联网上关于它的信息很少。

    【讨论】:

    • 在我的示例中,活动联合是指 WCF 服务是依赖方(因为它没有登录页面)。对吗?
    • 不,您的 WCF 服务必须拥有某种机制来创建 SOAP 消息并将凭据传递给 STS,这是 Active Federation,您的服务是 Active Requestor(您可以按照您想要的方式接收凭据,例如使用 Silverlight 客户端的登录窗口)。如果你想使用来自身份提供者的登录页面并且不担心接收和传递凭据,你应该使用被动联合,在这种情况下你的服务是被动请求者(他只重定向,而 IdP 完成所有工作)。跨度>
    • 你有没有开始写博客?我一直在寻找有关如何为没有运气的 MVC 应用程序进行主动身份验证的文档:-(
    • 为什么 RP 应该在 Active Federation 中向 STS 询问安全令牌?如果它可以创建登录窗口和登录逻辑,它不能创建声明/令牌吗?就像完全避免外部 STS 一样
    • @BlueClouds 您希望在许多情况下都处于活动状态,包括我的:您有一个设置了多个联盟的 STS(即,您让用户从多个来源登录,CustomerA、CustomerB、CustomerC 都登录到我的应用程序,我希望我的应用程序针对这些客户的 AD 服务器对用户进行身份验证)。所以他们点击了我的应用程序,我希望我的应用程序处理登录表单并从我的 STS 请求令牌(我的请求指示他们应该验证的领域)。这样我就不必处理带有“领域发现”页面的小型“ADFS 登录页面”应用程序了。
    【解决方案2】:

    简而言之,Passive Federation 只是一个短语,用于表示您的浏览器被重定向到 STS 托管的登录页面的场景。登录后,STS 将您重定向回带有一些 cookie 或其他内容的引用 URL,并且您在信任 STS 的站点上进行了身份验证(使用指纹、证书、加密等)。

    您也不必那样做。例如,我喜欢我的 ASP.NET 站点使用用户提供的凭据主动联系 STS,但这意味着 ASP.NET 应用程序池必须使用 Windows Auth 在 STS 进行身份验证才能将用户提供的凭据发送到获取一个令牌,然后我将令牌显式添加到会话中。换句话说,我没有使用被动联合,但这只是一种选择。

    【讨论】:

      【解决方案3】:

      您可以在此处阅读有关被动声明的更多信息:

      http://garymcallisteronline.blogspot.co.uk/2012/11/claims-explained.html

      Active 调用是对 WSActive 端点的直接调用(它们支持多种身份验证类型)。以下代码显示了使用用户名 active 端点进行的活动调用。

          private static GenericXmlSecurityToken GetToken(string username, string password, string url, string audienceUrl)
          {
              var factory = new WSTrustChannelFactory(new Microsoft.IdentityModel.Protocols.WSTrust.Bindings.UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(url));
              factory.Credentials.UserName.UserName = username;
              factory.Credentials.UserName.Password = password;
      
              factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
              factory.TrustVersion = TrustVersion.WSTrust13;
              WSTrustChannel channel = null;
      
              var rst = new RequestSecurityToken
              {
                  RequestType = WSTrust13Constants.RequestTypes.Issue,
                  AppliesTo = new EndpointAddress(audienceUrl),
                  KeyType = WSTrust13Constants.KeyTypes.Bearer,
              };
              channel = (WSTrustChannel)factory.CreateChannel();
              return channel.Issue(rst) as GenericXmlSecurityToken;
          }
      

      【讨论】:

      • 有谁知道如何在 .NET 4.5 中做同样的事情?看起来发生了很大变化,具体来说,“UserNameWSTrustBinding”不再存在......?
      【解决方案4】:

      即使我一开始也有同样的问题,但这个blog 帮了我很多。

      我建议你先浏览samples,然后再分析文档。

      WCF 联盟虽然很棘手。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 2012-10-19
        • 2012-12-25
        • 1970-01-01
        相关资源
        最近更新 更多