HttpContext.Session.Abandon()在MVC核心中不起作用。 Session.clear不会注销我的用户

时间:2019-02-28 09:27:52

标签: asp.net-core-mvc

我收到一条错误消息,提示“ ISession不包含'Abandon'的定义,并且找不到可访问的扩展方法'Abandon'接受类型为'ISession'的第一个参数”。

我曾尝试使用session.clear,但即使在注销后,如果我打开网站,该用户也将登录。

这是我得到的错误

enter image description here

3 个答案:

答案 0 :(得分:0)

这是我在ASP .NET CORE项目中实现Session的方式:

创建一个SessionTimeout过滤器:

public class SessionTimeout : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.HttpContext.Session == null ||!context.HttpContext.Session.TryGetValue("UserID", out byte[] val))
        {
            context.Result =
                new RedirectToRouteResult(new RouteValueDictionary(new
                {
                    controller = "Pages",
                    action = "SessionTimeout"
                }));
        }
        base.OnActionExecuting(context);
    }
}

在您的Startup.cs中注册此过滤器:

在您的ConfigureServices方法中:

services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromMinutes(10);               
            });

在“配置”中添加:

app.UseSession();

最后用如下过滤器装饰您的类/方法:

    [SessionTimeout]
    public class DashboardController : Controller

要基于视图中的注销事件破坏会话,请执行以下操作:

public IActionResult Logout()
        {
            HttpContext.Session.Clear();
            return RedirectToAction("Login", new { controller = "Pages" });
        }

答案 1 :(得分:0)

似乎我的会话存储在cookie中,使用session.clear()时没有被清除/删除

所以我用了它,它看起来像是一种魅力。

foreach (var cookie in Request.Cookies.Keys)

        {
            if (cookie == ".AspNetCore.Session")
                Response.Cookies.Delete(cookie);
        }

答案 2 :(得分:0)

HttpContext.Session.Clear() 在我的帐户/注销页面的控制器中的实时站点上对我不起作用。

我发现设置/Account/Logout/ 的href 是问题所在。我将链接更改为 /Account/Logout。

如果您在 .NET Core 3.1 中遇到会话问题,请尝试此操作。这也可能是我无法使用 Cookie 身份验证的原因 - 我最终放弃并转而使用 Sessions。