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

Asp.net mvc 登录后立即在ActionFilter中检查User.Identity.IsAuthenticated,asp.net-mvc,forms-authentication,action-filter,Asp.net Mvc,Forms Authentication,Action Filter,我基本上使用的是ASP.NETMVC示例中的AccountController。它使用FormsAuthentication来处理用户登录。请确定,以下是处理用户登录的代码: public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) { if (!ValidateLogOn(userName, password)) {

我基本上使用的是ASP.NETMVC示例中的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");
      }
    }
从注释行可以看到,我想在这个方法中设置一个会话变量。然而,我认为这并不是直接在控制器中设置会话变量的最优雅的方式。在单元测试这种方法时也很不方便(虽然我可以模拟它,当然,但仍然如此)

所以,我想,我创建了一个自定义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
,因为我知道它是页面生命周期中最后一个被调用的方法,但运气不好。我还尝试了
OnActionExecuting
OnActionExecuting
OnResultExecuting
,但总是错误的


有没有优雅的解决方案?或者我应该放弃并直接在控制器中设置会话变量吗?

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


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

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