C# 将用户名保存到会话属性以帮助保护站点

C# 将用户名保存到会话属性以帮助保护站点,c#,asp.net,session,session-variables,C#,Asp.net,Session,Session Variables,有些人表示不喜欢我在这个问题上提出的特定解决方案,但请不要浪费我的时间建议完全替代的方法。我无法控制我所从事工作的要求。如果你不同意,也没有答案,那就继续前进吧。谢谢 首先,这是一个实践项目,公众不会使用。我需要使用用户名的会话属性来保护我网站中的一些页面。当输入正确的用户名和密码组合时,会出现保存到会话中的用户名。我的老板检查了我的实现,并说将用户名值直接存储到HttpSessionState是错误的,您应该设置会话的username属性,并将会话对象存储到HttpSessionState中。

有些人表示不喜欢我在这个问题上提出的特定解决方案,但请不要浪费我的时间建议完全替代的方法。我无法控制我所从事工作的要求。如果你不同意,也没有答案,那就继续前进吧。谢谢

首先,这是一个实践项目,公众不会使用。我需要使用用户名的会话属性来保护我网站中的一些页面。当输入正确的用户名和密码组合时,会出现保存到会话中的用户名。我的老板检查了我的实现,并说将用户名值直接存储到HttpSessionState是错误的,您应该设置会话的username属性,并将会话对象存储到HttpSessionState中。现在我想我明白了他指的是我的代码的哪些部分了,但改变这一点会破坏任何人在单个用户登录后都可以使用直接链接到页面的安全性

确保阅读代码中的注释,我添加它们来描述有问题的行

在安全性方面起作用的是什么,但用户名直接存储在HttpSessionState中:

//login.ascx.cs
private void Login_Click(object sender, EventArgs e)
{
   if (sender == null || e == null)
   {
      throw new ArgumentNullException("Null Exception: Login_Click");
   }

   User user = new User();            
   user.Login(_username.Text, _password.Text);           

   if (user.IsValid() && user.GetIsUser() != false)
   {
      user.Save();
      //the line below is what I used to make the secure pages work properly.
      //but based on what my boss says, I think this is what should be changed.
      Session["Username"] = _username.Text;
      //What i tried instead was to set 'MySession.Current.Username = _username.Text;'
      //which allowed successful login, but the pages became insecure once again.
      Response.Redirect("Secure/Default.aspx");
   }
   else
   {
      DisplayErrors(user._validationErrors);
   }
   _errors.Text = errorMessage;    
}       
和MySession.cs

public string Username
{
   get
   {
      if (HttpContext.Current.Session["Username"] == null)
      {
         return string.Empty;
      }
      else
      {
         return HttpContext.Current.Session["Username"].ToString();
      }
   }
   set
   {
      //when the line below is uncommented, the secure pages are vulnerable
      //but if I comment it out, they work properly.
      //HttpContext.Current.Session["Username"] = value;
   }
}
那么,如何设置会话的username属性,并在维护安全站点的同时将会话对象存储到HttpSessionState中呢

编辑:@Win,在Secure/Default.aspx.cs中

private void Page_load(object sender, System.EventArgs e)
{
   ...
   if((string)Session["Username"] != _labelusername.Text)
   {
      Response.Redirect(redirectLogin); //to login page
   } 
   else {} //success
}
你应该检查一下表格。网上有很多这样的例子:


使用会员资格,而不是会话来进行身份验证。我想我的第一行已经清楚地表明,这是一个培训项目,这样做不是项目的一部分,这样做将是负面的。很有可能我以后会按照你的方式来做。我明白,但是会员制很容易使用,我不明白为什么你会通过做一些不正确的事情来训练。会话永远不能用于存储安全敏感信息。它是一个特定于用户的缓存,仅此而已。不要将其用于任何身份验证或安全性!MySession.Current.Username=\u Username.Text;只要它是静态类,它就有效。如何在Secure/Default.aspx中实现安全性?请张贴该页面的安全检查代码。好的,我用你要求的信息编辑了OP。