0

我想根据 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"] 时出错。

4

1 回答 1

1

因为我在访问存储在会话中的用户对象时遇到问题。

您没有将信息存储在会话中。您将其存储在缓存中。那是你的问题。缓存在您的应用程序的所有用户之间共享。因此,HttpContext.Cache您可以使用HttpContext.Session.

除了使用会话和缓存之外,您还可以将此信息存储在表单身份验证 cookie 的 UserData 部分中,正如我在这篇文章中所说明的那样

于 2013-01-21T13:18:38.733 回答