登录后立即在 ActionFilter 中检查 User.Identity.IsAuthenticated

Posted

技术标签:

【中文标题】登录后立即在 ActionFilter 中检查 User.Identity.IsAuthenticated【英文标题】:Check User.Identity.IsAuthenticated in ActionFilter right after login 【发布时间】:2010-11-04 00:24:09 【问题描述】:

我基本上使用的是 ASP.NET MVC 示例中的 AccountController。它使用 FormsAuthentication 来处理用户登录。可以肯定的是,这里是处理用户登录的代码:

    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    
      if (!ValidateLogOn(userName, password))
      
        return View();
      

      FormsAuth.SignIn(userName, rememberMe);


      //Session["userId"] = 1;


      if (!String.IsNullOrEmpty(returnUrl))
      
        return Redirect(returnUrl);
      
      else
      
        return RedirectToAction("Index", "Home");
      
    

从注释行可以看出,我想在这个方法中设置一个 Session 变量。但是,我认为这不是直接在控制器中设置 Session 变量的最优雅的方式。对这种方法进行单元测试时也很不方便(虽然我可以模拟它,当然,但仍然如此)。

所以,我想,我创建了一个自定义 ActionFilterAttribute,它在这个登录例程之后运行。如果登录成功,请在此自定义属性中设置会话变量。代码如下:

  public class SetSessionAttribute : ActionFilterAttribute
  
    public override void OnResultExecuted(ResultExecutedContext resultContext)
          
      if (resultContext.HttpContext.User.Identity.IsAuthenticated)
      
        resultContext.HttpContext.Session["userId"] = 1;
      

      base.OnResultExecuted(resultContext);
    
  

问题是User.Identity.IsAuthenticated 在下一次“页面加载”之前总是返回 false。我正在覆盖OnResultExecuted,因为我收集到它是页面生命周期中调用的最后一个方法,但没有运气。我也试过OnActionExecutingOnActionExecutedOnResultExecuting,但总是假的。

有没有一个优雅的解决方案?还是应该放弃,直接在控制器中设置会话变量?

【问题讨论】:

【参考方案1】:

我在注销时遇到了类似的问题,因为 User.Identity.IsAuthenticated 在下一页请求之前为真,但我需要一种方法来了解用户是否真的完成了应用程序的工作。

我认为你应该在控制器中设置 Session 或 ViewData 变量,或者通过 routeValues 将其传递给另一个控制器。

【讨论】:

感谢您的回复。是的,我可以在控制器中设置会话,但这是我试图避免的。我仍然希望有一个可行的替代方案。

以上是关于登录后立即在 ActionFilter 中检查 User.Identity.IsAuthenticated的主要内容,如果未能解决你的问题,请参考以下文章

设置后我无法立即登录元数据库

在 C# 中注销网站后立即拒绝重新登录

在 .net 核心中,在用户登录后立即进行一些日志记录。而不是在每个请求上

app 立即杀进程导致 webview保存的cookie失效

Backand:注册后立即登录?

Swift - 立即解析 Facebook 登录默认为用户取消登录