我想根据 User.Identity.Name 对用户进行身份验证,并从 SQL Server 数据库中获取其他详细信息,例如角色和上次登录日期等。
登录后,我应该授权同一用户进行后续调用,而无需访问数据库。
但是,我在初始登录时点击并加载了用户信息,并将其存储在会话中。
这是我的 SQL 表
应用用户
- UserId -> 此处存储的 windows 身份名称映射
- 显示名称
- 角色 ID
- 上次登录日期
- 活跃
登录控制器逻辑
public ActionResult Login()
{
string userId = User.Identity.Name;
userId = userId.Substring(userId.IndexOf(@"\") + 1);
var key = "Roles." + userId;
var roles = HttpContext.Cache[key]
if (roles == null)
{
User user = AdminService.SelectUser(userId);
roles = new string[] { user.Role.RoleName };
HttpContext.Cache.Add(key, roles, null,
DateTime.Now.AddMinutes(HttpContext.Session.Timeout),
Cache.NoSlidingExpiration);
HttpContext.User = Thread.CurrentPrincipal = new
GenericPrincipal(User.Identity, roles);
HttpContext.Session["LoggedInUser"] = user;
}
}
我也有下面的代码来授权用户在 MVC3 中的每个请求
void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
string userId = User.Identity.Name;
userId = userId.Substring(userId.IndexOf(@"\") + 1);
var key = "Roles." + userId;
var roles = HttpContext.Cache[key];
if (roles != null)
{
HttpContext.Current.User =
Thread.CurrentPrincipal =
new GenericPrincipal(User.Identity, roles);
}
}
}
但我建议更改上述逻辑,因为我在访问存储在会话中的用户对象时遇到问题。我不知道为什么会这样。
是否有人有其他可能的代码/逻辑来进行上述混合身份验证?
编辑:我在其他一些控制器方法中访问 HttpContext.Session["LoggedInUser"] 时出错。