Windows身份验证自定义验证(来自数据库)

本文关键字:数据库 身份验证 自定义 验证 Windows | 更新日期: 2023-09-27 18:20:35

我运行一个使用表单身份验证的ASP.NET网站。事实上,用户不必输入任何内容——我使用Request.ServerVariables["LOGON_USER"],并使用自定义类EmployeeInfo在特定的SQL数据库中查找该用户名,然后根据结果,用户被重定向到默认页面或错误页面,根据错误类型显示不同的消息:

Web.config:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx"/>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

Login.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        FormsAuthentication.SignOut();
        string UserName = Request.ServerVariables["LOGON_USER"];
        EmployeeInfo CurrentEmployee = EmployeeInfo.RequestDBInfo(UserName); // SQL magic here
        if (CurrentEmployee = null)
            Response.Redirect("AccessDenied.aspx?Message=NoInfo");
        else
            if (CurrentEmployee.Suspended = true)
                Response.Redirect("AccessDenied.aspx?Message=Suspended");
                if (CurrentEmployee.Expired = true)
                    Response.Redirect("AccessDenied.aspx?Message=Expired");
                    if (CurrentEmployee.Position = null)
                        Response.Redirect("AccessDenied.aspx?Message=NoPosition");
                    else
                        FormsAuthentication.RedirectFromLoginPage(CurrentUserName, true);
    }
}

直到最近,由于安全原因,我们不得不切换到Windows身份验证。现在,如果用户无效,我的网站会默认打开Login.aspx页面,并将用户重定向到相应的错误页面。但用户只需键入URL就可以打开任何页面,因为当然不执行表单身份验证,并且用户已通过Windows成功进行身份验证。

所以我的问题是:

在Windows身份验证的基础上实现数据库附加检查的最佳做法是什么?据我所知,我需要在Global.asax中更改Application_AuthenticateRequest

Windows身份验证自定义验证(来自数据库)

从给出的信息来看,tt听起来像是您在使用IIS时启用了"集成Windows身份验证",在设置中禁用了"允许匿名"。您网站的所有用户都将在其web浏览器和服务器(以及底层网络基础设施)之间进行身份验证。经过身份验证后,IIS将检查网站资源文件上的ACL,以确保他们有权(通过NTFS)请求该文件,而且这一设置显然是正确的,以便允许请求访问您的ASP.Net代码。好的,既然你的代码已经到达了,让我们从一些策略开始:

您提到Application_AuthenticateRequest。这是一个很好的方法,因为这为您提供了一个注入点,在请求者通过配置的安全设置(首先是IIS,然后是web.config中设置的任何包含自定义模块的内容)进行身份验证后,编写自定义安全代码。此外,您可以只在这一部分中编写安全代码,它将在您的网站上的每个页面上执行。当您为该方法编写代码时,您可以通过检查HttpContext.Current.User是否为null以及HttpContext.Current.User.IsAuthenticated是否为true来检查当前用户是否已通过身份验证。您可以从User属性获取用户的网络ID,就像您过去使用"Request.ServerVariables["LOGON_user"]"一样。一旦您有了ID,您就可以进行数据库查找,然后根据需要重定向。

出于性能原因,如果在您的安全模型下可以接受,您可能需要缓存此信息。例如,一种简单的方法是将具有权限的安全对象存储在Session中。然后你可以先检查一下,如果他们的用户还没有经过身份验证的会话,那么就进行数据库查找等。