我正在编写一个MVC3
使用 Windows 身份验证的应用程序。一旦通过身份验证,我就有一个唯一的用户 id 值。
我需要查询外部数据库(具有只读访问权限)以获取更多信息(例如姓名、电子邮件、电话、部门)。
我在哪里执行这个查询,我应该在哪里存储返回的信息,这样我就不必不断地查询来获取它。
我正在编写一个MVC3
使用 Windows 身份验证的应用程序。一旦通过身份验证,我就有一个唯一的用户 id 值。
我需要查询外部数据库(具有只读访问权限)以获取更多信息(例如姓名、电子邮件、电话、部门)。
我在哪里执行这个查询,我应该在哪里存储返回的信息,这样我就不必不断地查询来获取它。
将其存储在 Session 中,以便跨请求使用。尽管有些虔诚的人会说您的应用程序应该是无状态的,并且您应该在每次请求时从该数据库中提取。
在您的 asp:login 控件上,有一个名为"OnAuthenticate"的属性,它需要以下签名:
protected void (object sender, AuthenticateEventArgs e)
如果他们通过或未通过身份验证,您可以从那里执行操作,例如在@Yuiry 建议的会话中。
您可以通过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;}
}