【问题标题】:WIF - FederatedSignOut not signing user out all sitesWIF - FederatedSignOut 没有让用户退出所有站点
【发布时间】:2016-07-20 16:36:47
【问题描述】:

我正在使用 Windows Identity Foundation。 (对于一些 MVC 2.0 站点)

我在让某人退出所有受 WIF 保护的网站时遇到了真正的问题。

看起来我的退出只是在当前站点上退出。

这是我的代码

public void FederatedSignOut(string replyUrl)
       {             

        var authModule = FederatedAuthentication.WSFederationAuthenticationModule;
        WSFederationAuthenticationModule.FederatedSignOut(new Uri(authModule.Issuer),  new Uri(replyUrl));
     }

运行此代码后,我仍然可以浏览到用户访问过的任何其他网站。 但是我退出了我退出的站点。

联合注销是否有效?

非常感谢

【问题讨论】:

    标签: wif


    【解决方案1】:

    是的,联合注销有效,但并非总是如此 :-)。你用的是什么STS? (例如 ADFS?您自己的?)

    这里有一些介绍信息:http://msdn.microsoft.com/en-us/library/ff359102.aspx#sec9

    查看我们的“模拟”sts 如何处理注销。

    【讨论】:

    • 嗨,我们有自己的登录站点,外部用户必须登录,然后获得 wif 令牌。我正在从依赖方站点之一调用注销代码。我希望它能够让我退出所有依赖方。
    • 如果您有自己的 STS,那么您有责任为用户登录的其他应用程序实现 SSout。有关详细信息,请参阅我上面提到的示例。
    • 我已经向我们的自定义 sts 添加了一些代码,这些代码在注销时会按照您建议的操作重定向到每个依赖方 - 我的重定向看起来像这样:return Redirect(" myrelyingparty?wa=wsignoutcleanup1.0&wreply=http://mysts/…); 很好我还可以添加回复 url,这样我就可以回到 sts 并清理其他联合站点。无论如何,它似乎工作!我很高兴,谢谢!
    【解决方案2】:

    WIF 有一个 FederatedPassiveSignInStatus 控件可以为您完成工作。

    本质上,这会向 STS 发送“wa=wsignout1.0”WS-Federation 命令。但是,STS 可能不会执行此操作。 ADFS 可以。

    【讨论】:

    • 谢谢,我会看看这个控件。根据我今天下午读到的内容,我想知道我是否需要使用该 wa 命令调用所有依赖方进行清理。它不像最初看起来那么简单!
    • 我应该补充一点,我们在一个有两个节点的负载均衡器后面运行我们的站点。我想知道这是否会导致退出问题。谢谢
    • 也许吧。 NLB 的问题在于 RP 可能无法读取 cookie,因为它们受到机器密钥的保护。粘性会话是一种答案。 Vittorio 的书(第 124 页)讨论了使用 SSL 证书作为替代方案。
    【解决方案3】:

    将我的应用程序退出到外部 sts 时,我退出了我的应用程序但仍保持登录状态 ntexternal sts OKTA

    WSFederationAuthenticationModule fam = FederatedAuthentication.WSFederationAuthenticationModule;`
    
        // Native FederatedSignOut doesn't seem to have a way for finding/registering realm for singout, get it from the FAM
        string wrealm = string.Format("wtrealm={0}", fam.Realm);
    
        // Check where to return, if not set ACS will use Reply address configured for the RP
        string wreply = !string.IsNullOrEmpty(reply) ? reply : (!string.IsNullOrEmpty(fam.Reply) ? fam.Reply : null);
    
        // Create basic url for signout (wreply is set by native FederatedSignOut)
        string signOutUrl = WSFederationAuthenticationModule.GetFederationPassiveSignOutUrl(fam.Issuer, null, wrealm);
    
    
        WSFederationAuthenticationModule.FederatedSignOut(new Uri(signOutUrl), !string.IsNullOrEmpty(wreply) ? new Uri(wreply) : null);
    

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 2018-05-16
      • 2018-11-28
      • 2018-07-24
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多