在我的ASP.NET Web应用程序中,如果用户存在于数据库中(我们第一次在会话中保存用户详细信息之后),我希望每次用户尝试从应用程序获取页面时进行检查.我尝试使用global.asax中的Application_AuthenticateRequest事件来检查每个请求,但此事件中不存在会话.我需要一个建议,我可以放置我的授权逻辑,我仍然可以使用会话数据(以减少数据库访问).
你听起来好像在"滚动自己的"身份验证系统.
我将研究使用ASP.NET内置的Forms身份验证系统,该系统通常与ASP.NET 成员资格提供程序一起使用.SQL Server已经存在内置提供程序,您可以通过继承System.Web.Security.MembershipProvider基类来创建自己的成员资格提供程序.
实际上,一旦客户端成功通过身份验证,ASP.NET成员资格提供程序通常会在客户端的浏览器中设置客户端cookie(也称为身份验证票证).每次后续页面请求都会将此cookie返回给Web服务器,从而允许ASP.NET以及您的代码确定用户是谁,通常只需要一行代码:
string username = HttpContext.Current.User.Identity.Name; // The above gets the current user's name. if(HttpContext.Current.User.Identity.IsAuthenticated) // Do something when we know the user is authenticated.
然后,您不需要在Session状态中存储任何内容.当然,如果您想将特定于用户的数据存储在会话变量中(即用户数据可能不是用户身份验证的一部分,也许是用户最喜欢的颜色等),那么无论如何都可以将其存储在会话变量(在用户首次通过身份验证后从数据库中检索它).会话变量可以基于用户的名称(假设唯一名称)进行存储,并使用类似于上面的代码进行检索,该代码获取当前用户的名称以访问正确的会话对象.
使用内置表单身份验证还允许您使用web.config中的简单声明性代码"保护"您网站的某些区域免受未授权用户的攻击,例如:
将上述内容添加到"主"web.config将确保未授权用户无法访问您的任何页面(尽管您实际上可能永远不会这样做 - 它只是作为示例).将ASP.NET 角色提供程序与成员资格提供程序结合使用,可以更加精确地了解谁可以访问或不能访问您网站的各个部分.