使用会话ID在安全网页上验证用户

时间:2013-01-14 23:44:45

标签: c# asp.net session sessionid

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

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

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

3 个答案:

答案 0 :(得分:4)

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

  • 所有用户和凭据都是偶然设置为某种持久性存储的相同值,或
  • 您正在某个地方的static字段中存储对会话的引用,其值由所有用户共享

但是,如果没有显示代码,就很难调试。

答案 1 :(得分:2)

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

将登录用户的userID存储在会话中。 如果有有效的用户ID,请检查安全页面。

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

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

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

答案 2 :(得分: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"); 
   }

我强烈建议你反对这种做法&实施适当的会员制度,因为你必须在每个&每个页面,如果不是,如果以后将很多管理员角色添加到网站中,您仍然会遇到麻烦。

达明。