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

时间:2014-09-04 13:45:56

标签: c# asp.net windows-authentication global-asax

我运行一个使用表单身份验证的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身份验证之上实现数据库附加检查的最佳做法是什么?据我了解,我需要更改Application_AuthenticateRequest中的Global.asax

1 个答案:

答案 0 :(得分:0)

从提供的信息来看,听起来好像您正在使用IIS,例如&#34;集成Windows身份验证&#34;已启用,&#34;允许匿名&#34;在设置中禁用。您网站的所有用户都在其Web浏览器和服务器(以及底层网络基础结构)之间进行身份验证。经过身份验证后,IIS正在检查网站资源文件上的ACL,以确保他们有权甚至请求文件(通过NTFS),并且显然已正确设置,以便允许请求到达您的ASP.Net代码。好的,现在你的代码已经到了,让我们从一些策略开始:

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

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