我想获取当前登录用户的ID。我可以获得用户名:User.Identity.Name
。我有两个表用户和预订。 UserID是Reservations表中的外键。
我已经构建了一个返回当前登录用户id的函数:
private Int32 ReturnUserID() {
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand cmd = new SqlCommand("ReturnUserID", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("Username", User.Identity.Name);
cmd.Parameters.Add(p1);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read()) {
int u = Convert.ToInt12(rd["UserID"]);
return u;
} else return 0;
}
请告诉我一个具体的方法,我如何获取并存储当前登录用户的ID?
答案 0 :(得分:3)
您正在使用的教程看起来依赖于FormsIdentity和GenericPrincipal,因此您可以通过强制转换来发现它们的属性:
var p = (GenericPrincipal)HttpContext.Current.User;
var i = (FormsIdentity)HttpContext.Current.User.Identity;
//look for claims or whatever you use to store the ID
如果您有自定义IIdentity或IPrincipal,则更改演员表以使用您的自定义类型并以此方式获取ID属性。
编辑:我建议做的一种方法是从你提到的教程中选择这一行:
HttpContext.Current.User
= new System.Security.Principal.GenericPrincipal(identity, roles);
...而不是使用GenericPrincipal,创建自己的IPrincipal,它也存储用户ID。这种方法需要在每次请求时往返数据库。
替代方法是将用户ID存储在会话中,这是安全的,但会消耗内存。
最后,您可以将ID存储在FormsAuthenticationTicket的UserData属性中(以及角色)。表单身份验证票证已加密,但已发送到客户端。这种方法可能是整体表现最好且体面安全的。
要采用这种方法,您需要更改教程代码的这一部分以包含ID:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
userName,
DateTime.Now,
DateTime.Now.AddMinutes(50),
rememberUserName,
roles + "@@@@" + userId, //<-******** This Line Changes ********
FormsAuthentication.FormsCookiePath);
//... then in Application_AuthenticateRequest() do something like this:
var userData = ticket.UserData.Split(new string[]{"@@@@"}, StringSplitOptions.RemoveEmptyEntries);
var userIdAsString = userData[1];
var roles = userData[0].Split( new char[]{ ',' } );