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

C# 获取ASP.NET Web窗体中当前登录用户的ID,c#,asp.net,C#,Asp.net,我想获取当前loggedin用户的id。我可以获取用户名:User.Identity.Name。我有两张桌子,一张是用户桌,另一张是预订桌。UserID是预订表中的外键。 我构建了一个返回当前登录用户id的函数: private Int32 ReturnUserID() { string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; SqlConnection con = n

我想获取当前loggedin用户的id。我可以获取用户名:
User.Identity.Name
。我有两张桌子,一张是用户桌,另一张是预订桌。UserID是预订表中的外键。 我构建了一个返回当前登录用户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;

}

请告诉我如何获取和存储当前loggedin用户的id的具体方法

您正在使用的教程似乎依赖于FormSideEntity和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,该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[]{ ',' } ); 
FormsAuthenticationTicket票证=新的FormsAuthenticationTicket(
用户名,
日期时间,现在,
DateTime.Now.AddMinutes(50),
记住你的名字,

roles+“@@@@@”+userId,//通常,如果您可以在问题中直接发布一些源代码,这会很有帮助。这样可以更容易地帮助回答,避免阅读7页的背景故事。:)我在回答中添加了一些细节。