在MVC中登录期间分配会话变量

时间:2015-01-29 17:00:22

标签: c# asp.net-mvc session asp.net-identity

我目前在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分配值,这样无论用户从哪里登录,都会通过代码?

1 个答案:

答案 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());