在ASP中获取当前登录用户的ID.NET Web窗体
本文关键字:ID NET Web 窗体 用户 登录 ASP 获取 | 更新日期: 2023-09-27 17:50:17
我想获得当前登录用户的id。我可以得到Username: User.Identity.Name
。我有两个表Users和Reservations。UserID是reservation表中的外键。我已经建立了一个函数,返回当前登录用户的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 ?
您正在使用的教程看起来依赖于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[]{ ',' } );
如果您已经在使用ASP。网络标识最直接的方法是使用用户管理器。成功登录后,您可以使用登录模型的电子邮件,使用用户管理器的FindByEmail或FindByEmailAsync方法检索用户对象。此外,如果您想找出用户的角色,那么可以通过解析用户的id和角色名来使用用户管理器的IsInRole角色方法。
****这段代码展示了如何在login.****上获取登录用户。
protected void LogIn(object sender, EventArgs e)
{
if (IsValid)
{
// Validate the user password
var userManager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
// This doen't count login failures towards account lockout
// To enable password failures to trigger lockout, change to shouldLockout: true
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
//If login success find the user record by email using user manager
var user = userManager.FindByEmail(Email.Text);
//Store logged in user in session
Session["CurrentUser"] = user;
//find out current user's role and save it in session
if(userManager.IsInRole(user.Id, "Admin"))
{
Session["CurrentUserRole"] = "Admin";
}
else
{
Session["CurrentUserRole"] = "Staff";
}
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
break;
case SignInStatus.LockedOut:
Response.Redirect("/Account/Lockout");
break;
case SignInStatus.RequiresVerification:
Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}", Request.QueryString["ReturnUrl"],RememberMe.Checked),true);
break;
case SignInStatus.Failure:
default:
FailureText.Text = "Invalid login attempt";
ErrorMessage.Visible = true;
break;
}
}
}