【问题标题】:Logging out from facebook when using MVC 5 OWIN使用 MVC 5 OWIN 时从 facebook 注销
【发布时间】:2016-03-09 18:36:18
【问题描述】:

我有一个 MVC 5 Web 应用程序,它设置了 facebook 身份验证并且运行良好。用户在登录页面上单击“Facebook”,登录 Facebook 并通过我们的网站进行身份验证。如果用户退出,对 AuthenticationManager.SignOut() 的调用会正确退出网站,但如果用户随后返回登录页面并再次单击“Facebook”,他们会立即登录,而无需登录脸书。

所以我的问题是,我如何配置 MVC 5 OWIN facebook 登录,以便用户在退出网站时退出 facebook,或者换句话说,防止缓存下一次的身份验证登录。我不希望用户 facebook 登录被静默缓存,以防他们与其他用户共享浏览器。

【问题讨论】:

    标签: asp.net-mvc facebook-login owin


    【解决方案1】:

    我知道这样做的唯一方法是将事件绑定到您的注销按钮或链接,并使用Facebook Javascript SDK 实际为您执行 Facebook 注销。

    <a href="/Account/Logout" id="Logout">LogOut</a>
    
    <script type="text/javascript">
       $(function(){
          $("#Logout").on("click", function(e){
            if(confirm("This will also log you out of Facebook.  Proceed?")){
               FB.logout(function(response) {
               // Person is now logged out
               });
             }else{ 
                //do not allow the link to continue and sign our of your site.
                //This is optional and allows you to provide options
                e.PreventDefault();
             }
          });    
       });
    </script>
    

    您实际上可以使用确认对话框来询问他们是否也想退出 Facebook。确认表示是,不确认表示否,只需将我从您的网站上注销即可。同样,使用 SDK 和一些控制逻辑应该可以提供您需要的结果。

    【讨论】:

    • 谢谢你——我怀疑这确实是我需要采用的方法。问题是 MVC / OWIN 东西负责登录过程,因此客户端没有使用 Facebook API 登录。我怀疑 FB.logout 将需要一个访问令牌 - 客户端不会拥有它,因为它不用于执行登录。在我看来,这个问题是 MVC 中的外部登录支持(也使用 MS/google 登录)的一个非常基本的问题 - 恕我直言,“使用 facebook 登录”并没有明确表明注销会让您登录到 facebook。跨度>
    • @fubaar 当您从服务器端使用 Facebook API 登录时,用户仍然需要登录 Facebook,以便他们可以批准权限,以便 Facebook 知道要发回的用户 ID到您的应用程序。服务器端或客户端,使用 Facebook 登录会将用户登录到 Facebook 和您的应用程序。
    • @fubaar - 至于您的第二条评论,这就是几乎所有 oAuth 提供者的工作方式。尝试使用您的社交帐户登录 FourSquare(例如)。然后注销,您仍将登录 Facebook 和/或 Twitter。 :)
    • 感谢您跟进第二条评论。我并不反对现实——当你将它用于 SSO 时,你已经登录到 Facebook——我只是不认为它是呈现给用户的方式,并且是共享计算机上的安全风险。 “使用其他服务登录”并未明确表明您在退出网站时仍将保持登录状态。
    • 我关于 MVC / OWIN 的观点是我们目前没有使用客户端 JavaScript 库登录,因此我们无法使用它进行注销(因为它会'没有正确的访问令牌等可用)而不放弃内置的 OWIN 功能。
    【解决方案2】:

    你不能。这样做需要能够访问 facebook.com 设置的 cookie,出于安全原因,这是明确禁止的:您只能访问自己域中的 cookie。使用 Facebook 登录与您的应用程序是分开的。用户并未真正登录您的网站。他们正在登录 Facebook,而 Facebook 只是在您的网站上验证用户身份。如果您真的担心,您可以在您的退出页面上添加一条消息,提醒他们也退出 Facebook。

    您可以尝试重新创建 Facebook 的注销代码(使用他们发送的相同数据发布他们使用的相同操作)。但是,我几乎可以肯定他们会为此使用某种 CSRF 保护,所以它可能不会起作用。

    【讨论】:

    • 这里的用户体验是他们点击了标题为“使用其他服务登录”下的按钮。 (在默认的 MVC 5 登录页面中)。然后在他们离开站点之前,他们单击“注销”按钮。不管技术现实如何,我认为 Joe User 不会期望仍然登录到 Facebook。在我看来,MVC 中的外部登录支持至少应该提供一种退出外部登录提供程序的方法,该方法不涉及获取 facebook 访问令牌的讨厌的黑客攻击。 Google 和 MS“登录提供商”似乎以同样的方式受到此问题的影响。
    【解决方案3】:

    看到这个帖子,想补充一下,帮助大众。

    在微软的指南“Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on”中,包含以下部分:

    注销您的应用并使用其他帐户登录

    如果您使用 Facebook 登录您的应用程序,然后退出并尝试使用不同的 Facebook 帐户(使用相同的浏览器)再次登录,您将立即登录到您之前使用的 Facebook 帐户。为了使用另一个帐户,您需要导航到 Facebook 并在 Facebook 上注销。相同的规则适用于任何其他 3rd 方身份验证提供程序。或者,您可以使用其他浏览器使用其他帐户登录。

    所以这种行为是设计使然。

    要了解有关 OWIN 的更多信息,请阅读以下内容:

    有更多的链接可以分享,但是 drats,声誉还不够高。 :)

    【讨论】:

      【解决方案4】:

      已经两年了,如果使用OpenID Connect,那么存在解决方案

      // POST: /Account/LogOff
          [HttpPost]
          [ValidateAntiForgeryToken]
          public ActionResult LogOff()
          {
              Request.GetOwinContext().Authentication.SignOut();
              return Redirect("/");
              //AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
              //return RedirectToAction("Index", "Home");
          }
      

      【讨论】:

        猜你喜欢
        • 2017-11-07
        • 2014-12-24
        • 2016-06-03
        • 2014-08-20
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2019-03-01
        相关资源
        最近更新 更多