0

这是我之前发布的问题的后续,但当时还不清楚。我希望我现在可以更清楚。

我在所有安全页面上登录后使用 ASP.NET 和 C# 来验证用户。我应该能够在不接触 web.config 文件的情况下执行此操作,因此请避免任何涉及编辑 web.config 文件的此类解决方案。经过一些调试,我发现当用户登录时,任何其他人(无需登录)都可以从另一台计算机访问安全页面,或者只是在同一台计算机上但在不同的浏览器中访问。这显然很糟糕,所以我想知道如何使用有效用户的初始会话 ID 来保护所有后续 page_load 免受具有直接页面路径但不是有效登录名的其他用户的影响。

目前,我在所有安全 page_load 函数中所做的唯一检查是检查 wether MySession.GetSessionId()==null。如何使用返回的这个值GetSessionId()来检查登录时的初始会话 ID 值是什么?

4

3 回答 3

4

每个用户和每个用户代理的会话已经是唯一的。如果多个用户都在访问同一个会话,那么您的会话创建和设置逻辑中肯定存在错误,可能是在设置用户 ID 的位置。我的心理调试告诉我:

  • 所有用户和凭据都意外地从某种持久性存储中设置为相同的值,或者
  • 您正在static某处的某个字段中存储对会话的引用,该字段的值由所有用户共享

但是,如果不显示代码,将很难调试。

于 2013-01-14T23:59:39.603 回答
2

仅仅依靠 sessionID 是不可行的!仅通过检查 sessionID,您就没有用户的任何信息。

将登录用户的用户 ID 存储在会话中。然后检查安全页面是否有有效的用户 ID。

不是最优雅的解决方案,但这种方式无需更改为 web.config。

然而,我怀疑网站中的身份验证/授权逻辑没有充分利用 asp.net 附带的会员功能。

也许您可以通过指出提供长期且安全的解决方案来获得一些分数。

于 2013-01-14T23:50:13.340 回答
0

快速而肮脏的解决方案。检查伪代码

在登录页面 (Login.aspx)

BtnLogin_click()
{
        // Query database to check username/password match
        // If Success store corresponding UserID in session
        Session["userID"]=YourDbValue;   // Say 1 is for administrator, 2 is for user
}

在安全页面上 (Secure.aspx)

 PageLoad(){
       if (Session["userID"]!="1")
          // Log this attempt somewhere  
          Response.Redirect("~/NotAuthorized.aspx"); 
   }

我强烈建议您反对这种方法并实施适当的会员系统,因为您必须在每个页面中都对其进行硬编码,否则,如果将来将许多管理员角色添加到站点中,您仍然会遇到麻烦。

达米安。

于 2013-01-15T07:21:02.553 回答