我目前在Login action
中有代码,因此当用户登录时,它会从数据库中提取一些数据并存储在Session
变量中。
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
switch (result)
{
case SignInStatus.Success:
{
using (var db = new somedbContext())
{
//do some query here
System.Web.HttpContext.Current.Session["userDepartment"] = departmentID;
}
return RedirectToLocal(returnUrl);
}
}
}
如果用户实际经历了登录过程,这可以正常工作。但是,如果用户尝试登录&#34;使用其他方法,例如使用cookie
(记住我),或某些浏览器保存凭据,或使用第三方登录等,这将不再有效。
我应该在哪里编写代码并为Session
分配值,这样无论用户从哪里登录,都会通过代码?
答案 0 :(得分:4)
您可以将逻辑放在基于IAuthorizationFilter的全局过滤器中对该会话变量进行延迟初始化。
过滤器可能是这样的:
public class SetDepartmentFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var userInfo = GetUserInfo(filterContext);
if (userInfo.IsAuthorized)
{
filterContext.HttpContext.Session["userDeparment"] = userInfo.Department;
}
}
private UserInfo GetUserInfo(AuthorizationContext filterContext)
{
// TODO: see if authorized, get department, etc.
}
}
应用程序启动的某个地方:
GlobalFilters.Filters.Add(new SetDepartmentFilter());