我运行一个使用表单身份验证的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
?
答案 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.IsAuthenticated
为true
来检查当前用户是否已通过身份验证。您可以像以前使用`Request.ServerVariables [&#34; LOGON_USER&#34;]&#39;那样从User
属性获取用户的网络ID。获得ID后,您可以进行数据库查找,然后根据需要重定向。
出于性能原因,如果您的安全模型可以接受此信息,则可能需要缓存此信息。例如,一种简单的方法是在Session
中存储具有权限的安全对象。然后你可以先检查一下,如果用户还没有经过身份验证的会话,那么就进行数据库查找等。