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

C# 在MVC中登录期间分配会话变量,c#,asp.net-mvc,session,asp.net-identity,C#,Asp.net Mvc,Session,Asp.net Identity,我目前在登录操作中有一个代码,因此当用户登录时,它将从数据库中提取一些数据并存储在会话变量中 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); } var result = await SignInManager.PasswordSi

我目前在
登录操作
中有一个代码,因此当用户登录时,它将从数据库中提取一些数据并存储在
会话
变量中

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);
            }    
    }
}
公共异步任务登录(LoginViewModel模型,字符串返回URL)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
var result=wait-SignInManager.PasswordSignInAsync(model.Email、model.Password、model.RememberMe、shouldllockout:true);
开关(结果)
{
案例标志状态成功:
{
使用(var db=new somedbContext())
{
//在这里做一些查询
System.Web.HttpContext.Current.Session[“userDepartment”]=departmentID;
}
返回重定向到本地(returnUrl);
}    
}
}
如果用户实际完成了登录过程,那么这种方法就可以正常工作。但是,如果用户尝试使用其他方式“登录”,例如使用
cookie
(请记住我),或者某些浏览器确实保存凭据,或者使用第三方登录等,这将不再有效


我应该在何处写入代码并为会话赋值,这样无论用户从何处登录,它都将遍历代码?

您可以将逻辑放在全局筛选器中,根据

过滤器可以是这样的:

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

您可以将延迟初始化该会话变量的逻辑放在基于的全局筛选器中

过滤器可以是这样的:

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

你能再详细说明一下吗?你有关于如何实现这一点的链接/教程吗?我如何检查用户是否获得授权?我无法访问任何方法,例如
User.Identity.GetuserId
等。您可以从
filterContext.HttpContext
获得所需的大部分内容,例如,
filterContext.HttpContext.User
。您需要确保此筛选器在建立用户的任何进程之后运行。您能再详细说明一下吗?您有关于如何实现此功能的链接/教程吗?如何检查用户是否获得授权?我无法访问任何方法,例如
User.Identity.GetuserId
等。您可以从
filterContext.HttpContext
获得所需的大部分内容,例如,
filterContext.HttpContext.User
。你需要确保这个过滤器在建立用户的任何进程之后运行。这就是为什么我不想完全使用会话的原因。同意,@emodrenroket。如果您使用集群,这尤其棘手。也许你应该发布一个关于替代方法的答案(可能已经有一个了)。这就是为什么我不想完全使用会话的原因。同意,@emodrenroket。如果您使用集群,这尤其棘手。也许你应该发布一个备选方法的答案(可能已经存在)。