C# 获取ASP.NET Web窗体中当前登录用户的ID
我想获取当前loggedin用户的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
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页的背景故事。:)我在回答中添加了一些细节。