如何注销Owin提供程序?

18

我正在按照这个教程进行学习,但是它没有告诉我如何退出登录。我尝试了

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);

Request.GetOwinContext().Authentication.SignOut()

          Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

您可以在此处获取示例代码:https://github.com/AndersAbel/SocialLoginWithoutIdentity

只需要添加一个动作即可。

public ActionResult SignOut()
 {
       Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
       return RedirectToAction("Index", "Home");
 }

这个方法加上我之前发布的三行代码中的任意一行。
目前我的结果是,我登录后,进入安全页面并可以看到它,然后我继续执行退出操作,退出后尝试返回安全页面,但我仍然被允许访问该安全页面。
所以实际上它并没有真正地将我登出。

不行。我可以在未登录的情况下访问我的安全页面。它似乎会重新创建带有所有声明的 cookie。就像它永远处于自动登录状态。 - chobo2
@Juventus18 - 不是那个意思,我是说,注销后你会被踢回到我的主页,然后你需要在浏览器地址栏中输入安全页面的网址。 - chobo2
我在你的GitHub账户控制器中看到,没有注销方法。请详细说明... - Dave Alperovich
@DaveAlperovich - 这不是我的代码,这就是我的问题所在。我正在遵循一个教程,但它没有告诉你如何注销。我试图通过在该示例上构建来添加该功能,但一直无法弄清如何注销。 - chobo2
奇怪,你的注销方法应该是有效的。我建议使用现成的解决方案重新开始。它们总是能够很好地工作,而且你的示例既过时又不完整。无论你想要使用cookie还是令牌认证,这都是一个糟糕的示例。 - Dave Alperovich
显示剩余6条评论
3个回答

21

正如教程中提到的那样,中间件使用默认认证类型但不覆盖它。

通过仅将externalCookie用作Owin参数,您正在清除Asp的cookie,但未清除用于存储Google提供程序的cookie

要这样做,您需要获取所有当前cookie的数组。 可以像这样轻松地完成:

Request.GetOwinContext()
       .Authentication
       .SignOut(HttpContext.GetOwinContext()
                           .Authentication.GetAuthenticationTypes()
                           .Select(o => o.AuthenticationType).ToArray());

以下是在教程中提到的内容:

调用UseGoogleAuthentication函数应该很明显为什么需要。

但是首先调用ToSetDefaultSignInAsAuthenticationType的原因并不像看起来那样显然。登录中间件通常依赖于社交登录中间件之前注册的外部cookie中间件。在外部cookie中间件中,它将自己设置为默认的登录类型。这就是社交登录中间件知道它应该使用外部cookie的方式。在这个设置中没有外部cookie,因此我们必须手动将主cookie中间件设置为默认的登录类型。只有当身份验证类型与社交登录中间件创建的身份验证匹配时,cookie中间件才会生成一个cookie。查看owin外部身份验证管道时,可以看到社交登录中间件和cookie中间件的安装方式。


这似乎有效。我有点困惑,仅清除 ASP 的 cookie 究竟是什么意思?你所说的“默认身份验证类型但不覆盖它”的 100% 是什么意思?我以为外部 Cookie 实际上是指由 Google 等制作的 cookie。而不是 Asp cookie。 - chobo2
抱歉,英语不是我的母语,所以它可能不意味着我想要的意思,但是,在本段落的链接中已经解释了。 - GaelSa
arf 网络问题,我更新了我的答案,展示了我在教程中找到解决方案的位置。 - GaelSa
在我的情况下它没有起作用。我把它放在了登录操作中。 - Heemanshu Bhalla

4
尝试设置缓存控制头。
public ActionResult SignOut() {
    var authenticationTypes = new string[] {
        DefaultAuthenticationTypes.ApplicationCookie,  
        DefaultAuthenticationTypes.ExternalCookie 
    };
    AuthenticationManager.SignOut(authenticationTypes);
    // HACK: Prevent user from being able to go back to a logged in page once logged out
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    // now redirect
    return RedirectToAction("Index", "Home");    
}

private IAuthenticationManager AuthenticationManager {
    get {
        return Request.GetOwinContext().Authentication;
    }
}

除非使用JavaScript并且未被禁用,否则用户可以随时点击浏览器的后退按钮。用户可以返回上一页并查看先前页面的内容,但如果他们尝试点击任何受保护的链接或刷新页面,则会被重定向到登录页面。


0

我现在的东西上有授权标签,这不是问题。问题是我按照教程添加了一个注销方法(其中有两行代码之一,在我的OP中,重定向到主页)。当我点击注销然后返回到安全页面时,我仍然可以访问该安全页面,即使我应该已经注销了。它从未真正将我注销。 - chobo2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接