0

我正在编写一个MVC3使用 Windows 身份验证的应用程序。一旦通过身份验证,我就有一个唯一的用户 id 值。

我需要查询外部数据库(具有只读访问权限)以获取更多信息(例如姓名、电子邮件、电话、部门)。

我在哪里执行这个查询,我应该在哪里存储返回的信息,这样我就不必不断地查询来获取它。

4

3 回答 3

1

将其存储在 Session 中,以便跨请求使用。尽管有些虔诚的人会说您的应用程序应该是无状态的,并且您应该在每次请求时从该数据库中提取。

于 2013-09-11T14:58:34.050 回答
0

在您的 asp:login 控件上,有一个名为"OnAuthenticate"的属性,它需要以下签名:

 protected void (object sender, AuthenticateEventArgs e)

如果他们通过或未通过身份验证,您可以从那里执行操作,例如在@Yuiry 建议的会话中。

于 2013-09-11T15:06:02.477 回答
0

您可以通过User.Identity.Name.

您可以使用 Session 状态,但是有一种模式可以使用 ModelBinders 来执行此操作。一个简单的选择就是使用会话状态来存储它,如果你很高兴它不会改变。

--

对于您的数据访问,您只需构建一些 DataAccess 功能以将其作为参数访问数据库。一个示例是使用 ADO.NET,并假设 SQL Server:

public DAO.User GetUserBy(string userId)
{
   var connString = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
   using(var da = new SqlDataAdapter(connString, "SELECT * FROM Users where UserId = @p0")
   {
      da.SelectCommand.Parameters.Add("@p0", userId);
      var dt = new DataTable();
      da.Fill(dt);

      DAO.User dbUser = ConvertToUsers(dt).FirstOrDefault();
      return dbUser;
   }
}

DataTable将行转换为DAO.User对象的辅助函数

private IEnumerable<DAO.User> ConvertToUsers(DataTable dt)
{
  var users = new List<DAO.User>(dt.Rows.Count);

  foreach(var row in dt.AsEnumerable())
  {
     users.Add(new DAO.User()
     {
         Name = row.Field<string>("FULL_NAME"),
         Age = row.Field<int>("AGE")
     });
  }

  return users;
}

然后类来存储用户

public class DAOUser
{
   public int Id { get;set; }
   public string Name { get; set; }
   public int Age {get;set;}
}
于 2013-09-11T15:05:22.110 回答