2014-09-04 252 views
0

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

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身份验证SE好奇的原因。现在,如果用户无效,我的网站默认会打开Login.aspx页面,并将用户重定向到相应的错误页面。但是用户只需输入URL即可打开任何页面,因为当然不会执行表单身份验证,并且用户可以通过Windows验证身份。

所以我的问题是:

什么是在Windows上实现身份验证的顶部通过数据库附加检查的最佳实践?据我所知,我需要改变Application_AuthenticateRequestGlobal.asax

回答

0

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

你提到了Application_AuthenticateRequest。这是一个很好的方法,因为在请求者通过配置的安全设置(IIS首先,然后在您的web.config包含的自定义模块中设置的任何设置)进行身份验证之后,这给您一个编写自定义安全代码的注入点。另外,您可以在这一节中编写安全代码,并且它会针对您网站上的每个页面执行。当您为此方法编写代码时,可以通过检查HttpContext.Current.User不为空来验证当前用户是否已通过验证,并且该HttpContext.Current.User.IsAuthenticatedtrue。您可以像使用Request.ServerVariables [“LOGON_USER”]那样从User属性中获取用户的网络ID。一旦拥有该ID,就可以进行数据库查询,然后根据情况进行重定向。

出于性能方面的考虑,如果您的安全模型允许,则可能需要缓存此信息。例如,一个简单的方法是在Session中存储具有权限的安全对象。那么你可以先检查一下,如果用户还没有经过验证的会话,那么执行数据库查找等。