获取ASP.NET Web窗体中当前登录用户的ID

时间:2015-05-21 22:18:45

标签: c# asp.net

我想获取当前登录用户的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?

1 个答案:

答案 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[]{ ',' } );