Raz*_*zie 5 asp.net-mvc forms-authentication action-filter
我基本上使用 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");
}
}
Run Code Online (Sandbox Code Playgroud)
从注释行中可以看出,我想在此方法中设置一个 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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是User.Identity.IsAuthenticated在下一次“页面加载”之前总是返回 false。我正在重写,OnResultExecuted因为我认为它是页面生命周期中最后一个要调用的方法,但没有运气。我也试过OnActionExecuting,OnActionExecuted和OnResultExecuting,但它总是错误的。
有没有一个优雅的解决方案?或者我应该放弃并直接在控制器中设置会话变量?
我在注销时遇到了类似的问题,因为 User.Identity.IsAuthenticated 在下一页请求之前都是 true,但我需要一种方法来了解用户是否真正完成了应用程序的工作。
我认为你应该在控制器中设置 Session 或 ViewData 变量,或者通过routeValues 将其传递给另一个控制器。
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |