我们有一个 MVC 应用程序,它有一个自定义表单身份验证视图/控制器。控制器将验证内容,然后执行 FormsAuthentication.RedirectFromLoginPage 调用。
此时,在 Global.asax 中,我们将收到一个 Application_OnAuthenticateRequest 调用,从中我们将获取其 Context.User 信息,并进行另一个调用以收集与此帐户相关的信息,然后将其存储在其 Context.User 和 System.Threading 中.Thread.CurrentPrincipal。我们还对这些信息进行了一些缓存,因为在我们的系统中检索我们需要的信息的成本很高,这会导致缓存失效并重新检索该信息。
此时我们将它们分成单独的调用似乎有点奇怪。我几乎想知道登录控制器是否不应该收集详细信息作为其身份验证检查的一部分并存储它们。然后,Application_OnAuthenticateRequest 只能担心缓存是否需要失效并重新检索用户详细信息。
或者也许还有其他处理这个问题的方法我什至不知道..?
您可以通过利用 MVC 来做您想做的事情RedirectToRouteResult
和自定义缓存更新ActionFilter
。这称为 PRG(重定向后获取)模式。实际上您已经在这样做了,但它有点令人困惑,因为您正在做的事情是经典 ASP.NET 做事方式和 MVC 做事方式之间的交叉。您最初的方法没有任何问题(只要它工作正常),但是要做同样的事情并更好地控制和理解它在计划中的工作方式,您可以这样做:
public class AuthenticationController :Controller
{
[HttpPost]
public RedirectToRouteResult Login(string username, string password)
{
//authenticate user
//store authentication info in TempData like
bool authenticated = true|false; // do your testing
if(authenticated)
{
TempData["MustUpdateCache"] = true | false;
return RedirectToAction("LoginSuccess", new{userId = membershipUser.UserId});
}
else
{
TempData["MustUpdateCache"] = true | false;
return RedirectToAction("Login");
}
}
[HttpGet, UpdateCache]
public ActionResult LoginSuccess(Guid userId, string url)
{
HttpContext.User = LoadUser(userId);
return View();
}
[HttpGet, UpdateCache]
public ViewResult Login()
{
return View();
}
}
public class UpdateCacheAttribute:ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var tempData = filterContext.Controller.TempData;
if (tempData.ContainsKey("MustUpdateCache") && (bool)tempData["MustUpdateCache"])
{
UpdateCache(filterContext);
}
}
void UpdateCache(ControllerContext controllerContext)
{
//update your cache here
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)