在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 ?

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

您正在使用的教程看起来依赖于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;
            }
        }
    }