在我的ASP.NET Web应用程序中,如果用户存在于数据库中,我希望每次用户尝试从我的应用程序获取页面时进行检查(当然,在我们第一次在会话中保存用户详细信息之后) )。 我试图在global.asax中使用Application_AuthenticateRequest事件 检查每个请求,但此事件中不存在会话。 我需要一个建议,我可以将我的授权逻辑放在哪里,我仍然可以使用会话数据(以减少数据库访问)。
答案 0 :(得分:5)
您听起来好像在“滚动自己的”身份验证系统。
我会考虑使用ASP.NET内置的Forms authentication系统,该系统通常与ASP.NET Membership Provider一起使用。 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.
然后,您不需要在会话状态中存储任何内容。当然,如果您希望将用户特定数据存储在会话变量中(即用户数据可能不是用户身份验证的一部分,也许是用户最喜欢的颜色等),那么所有这些意味着您可以将其存储在会话变量中(在用户首次通过身份验证后从数据库中检索它)。会话变量可以根据用户的名称(假设唯一名称)进行存储,并使用与上面类似的代码进行检索,该代码获取当前用户的名称以访问正确的会话对象。
使用内置表单身份验证还允许您使用web.config中的简单声明性代码“保护”您网站的某些区域,使其免受未经授权的用户的攻击,例如:
<authorization>
<deny users="?"/>
</authorization>
将上述内容添加到“主”web.config将确保未授权用户无法访问您的任何页面(尽管您可能永远不会在现实中执行此操作 - 仅作为示例)。将ASP.NET Role Provider与成员资格提供程序结合使用,可以更加精确地了解谁可以访问或不能访问您网站的各个部分。
答案 1 :(得分:1)
您可以使用SqlMembershipProvider(如果您不使用MSSQL,则使用自定义提供程序)并拒绝整个应用程序中未经身份验证的用户(登录页面除外)。此检查将仅限于登录时间,因为身份验证票证将存储在会话中或作为用户计算机上的cookie存储。
How To: Use Membership in ASP.NET 2.0和更多详细信息 Examining ASP.NET 2.0's Membership, Roles, and Profile