我基本上使用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
,因为我认为这是在页面生命周期中调用的最后一种方法,但没有运气。我还尝试了OnActionExecuting
,OnActionExecuted
和OnResultExecuting
,但它总是错误的。
这周围有优雅的解决方案吗?或者我应该直接放弃并在控制器中设置会话变量?
答案 0 :(得分:0)
我有一个类似的注销问题,因为User.Identity.IsAuthenticated在下一页请求之前是真的,但我需要一种方法来了解用户是否真的完成了应用程序的工作。
我认为你应该在控制器中设置Session或ViewData变量,或者通过routeValues将它传递给另一个控制器。