![](/img/trans.png)
[英]With ASP.NET MVC redirect to login page when session expires
[英]ASP.NET Core: session expires but user is not redirected to login page
这是我第一次使用 .net 内核,所以也许我做错了什么。 我的应用程序在 session 过期后没有重定向到登录页面,显然在我尝试读取 session 变量时导致Null Pointer Exceptions
。
启动.cs
services.AddAuthentication()
.AddCookie(options =>
{
options.Cookie.Expiration = TimeSpan.FromMinutes(180);
});
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(180);
});
我错过了什么吗?
更新:
如果我手动删除 .AspNetCore.Identity.Application cookie,我将被正确重定向到登录页面。
我怎样才能获得这种行为?
您可以通过在我们的自定义 class 中重新定义IActionFilter
的OnActionExecuting
方法来实现此目的。
首先将其添加到服务中:
services.AddControllersWithViews(options =>
{
options.Filters.Add(typeof(RequestAuthenticationFilter));
});
然后创建一个自定义的 class RequestAuthenticationFilter
并定义OnActionExecuting
方法。
public class RequestAuthenticationFilter : IActionFilter
{
private readonly IHttpContextAccessor _httpContextAccessor;
public RequestAuthenticationFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// OnActionExecuting
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
var session = _httpContextAccessor.HttpContext.Session.Get("UserId");
if (session == null)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Login", controller = "Account", area = "Identity" }));
}
}
/// <summary>
/// OnActionExecuted
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
从Sonu K 的回答中获取线索,我创建了一个属性,因此我可以将其应用于特定的 controller 或操作。 这是我的实现。
public class ValidateSessionAttribute : ActionFilterAttribute
{
public ValidateSessionAttribute() { }
public override void OnActionExecuting(ActionExecutingContext context)
{
var userId = context.HttpContext.Session.Get<long>(Constants.SessionKeys.UserId);
if (userId <= 0)
context.Result =
new RedirectToRouteResult(
new RouteValueDictionary(new { action = "Login", controller = "Account" }));
}
}
使用上述属性装饰 controller 以开始使用它。
[ValidateSession]
public class SomeController : Controller
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.