0

有没有更好的方法在不使用会话的情况下将登录用户的信息或实体存储在 mvc 3 应用程序中?因为以前,我想将它存储在会话中。但是由于没有 Session 的概念,那么检索它的最佳方法是什么?

这是用户的示例实体类:

public class User
{
  public UserName { get; set; }
  public Password { get; set; }
  public SecurityGroup { get; set; }
  public DepartmentID { get; set; }
}

会有一些页面我需要SecurityGroup用户的,并且会有一些页面我需要DepartmentID. 如果我每次需要时都检索数据,那将是愚蠢的。

只是需要你的意见,因为我仍然从这项技术开始。

谢谢!

4

3 回答 3

1

您可以创建一个 BaseController,其他控制器将从中继承,然后检查 ExecuteCore() 中的 System.Web.HttpContext.Current.User 并将 SecurityGroup 保存在 ViewData 中。

ViewData("SecurityGroup") = User.SecurityGroup

然后您可以在任何控制器中访问它。

示例(原谅 VB.NET)

Public Class BaseController
    Inherits System.Web.Mvc.Controller

    Protected Overrides Sub ExecuteCore()

        Dim currentUser As User = MyDatabaseLayer.GetUserByEmail(User.Identity.Name)

        ViewData("SecurityGroup") = currentUser.SecurityGroup

        MyBase.ExecuteCore()

    End Sub

End Class

然后在您的一个标准控制器中

Public Class MyController
    Inherits BaseController

    Public Function Index()

        If ViewData("SecurityGroup") = something Then

             'do something

        End If

    End Function

 End Class
于 2012-11-06T10:13:56.127 回答
1

但是由于没有 Session 的概念,那么检索它的最佳方法是什么?

我不明白这一点。当然MVC3中有Session的概念。我认为这取决于您想做什么,并且您需要问自己几个问题:

  1. 关闭选项卡会自动注销我的用户吗?
  2. 会议何时结束?(例如按“注销”,超时)

我发现它最有用的方式是利用 ASP.NET FormsAuthentication 机制和会话变量。

这是我编写的代码中的一个示例:

var curUser = context.Session["User"] as ViewUser;

if (curUser == null)
{
   // Generate token from given FB access token
   var token= 'your token';

   // Set the forms authentication auth cookie
   FormsAuthentication.SetAuthCookie(token, false);

   // Get user details to put inside the session vars
   var UserInstance = getUser(token);

   // Put user details in session vars
   context.Session["User"] = UserInstance;
}

令牌用于 oAuth 等,这就是该系统的构建方式,您可以使用用户的 id 代替。

现在这利用了 FormsAuthintication,因为您还有一个持续整个会话的安全 cookie,并且您不需要每次都使用令牌来寻址数据库,因为我将用户模型放在 Session 变量中。

这允许进行后备,这意味着:

  1. 尝试解析会话变量,如果没有
  2. 检查用户是否登录,并再次从数据库中解析用户
  3. 如果用户未登录 - 实现您的逻辑。

这对我来说很好。希望能帮助到你。

于 2012-11-06T13:51:48.283 回答
1

如果我每次需要时都检索数据,那将是愚蠢的。

我不这么认为,应该怎么做。如果您正在考虑将这些值存储在 Session 中,那么您还必须设计一种在用户关闭应用程序时终止会话的方法(这里“关闭”并不意味着他退出,他可能只是关闭了选项卡/浏览器)

你能做的就是user.identity.name获取当前登录用户的用户名,并SecurityGroup/DepartmentId在你需要的任何时候获取它。

于 2012-11-06T12:01:16.503 回答