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。如果您使用集群,这尤其棘手。也许你应该发布一个备选方法的答案(可能已经存在)。