在Web开发中,经常需要对某些资源进行访问控制,以确保只有授权的用户才能访问。例如,可能希望限制对特定类型的文件或URL请求的访问,而不需要用户登录。本文将介绍如何使用IIS和一些简单的代码来实现这一目标。
首先,需要设置应用程序使用Forms身份验证。这可以通过修改web.config文件来实现。在system.web部分添加以下配置:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Authentication/Login.aspx" name=".ASPNETFRM" />
</authentication>
</system.web>
这样设置后,只有当用户尝试访问被拒绝的资源时,Forms身份验证才会强制用户登录。如果没有指定授权部分,所有用户都可以访问所有资源。
接下来,需要限制对trace.axd文件的访问,只允许已认证的用户访问。为此,需要在web.config文件中添加一个location标签:
<configuration>
<location path="trace.axd">
<authorization>
<deny users="?" />
</authorization>
</location>
</configuration>
这样设置后,只有已认证的用户才能访问trace.axd文件。
在网站的根目录下创建一个新的Web应用程序,名为Authentication。这是ASP.NET将重定向需要认证的用户的地方。它应该与步骤1中添加到forms元素的loginUrl属性的第一部分匹配。
使用IIS,更改此文件夹的安全设置,移除匿名Digest和Windows身份验证,并启用Basic。
在Authentication文件夹中创建一个名为Login.aspx的文件。这个文件名应该与loginUrl属性的最后部分匹配。它将包含将Windows身份验证映射到基于ASP.NET forms应用程序的代码。
在Login.aspx中复制以下代码:
<%@ Page language="c#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %>
<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Configuration" %>
<script language="C#" runat="server">
private void Page_Load(Object Src, EventArgs e)
{
string user = HttpContext.Current.User.Identity.Name;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(user, false, 30);
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(ConfigurationSettings.AppSettings["AuthCookie"], encTicket));
Response.Redirect(FormsAuthentication.GetRedirectUrl(user, false));
}
</script>
当Page Load事件运行时,代码会从HttpContext获取当前用户的名称。然后创建一个新的FormsAuthenticationTicket,然后将其作为cookie返回给用户。cookie的名称必须与web.config中定义的名称相同。
在Authentication文件夹中创建一个新的web.config文件。在此文件中,需要添加在Login.aspx中拾取的cookie的应用设置值,并且需要将ASP.NET绑定到IIS身份验证,以确保HttpContext的User属性用IIS身份验证的用户详细信息填充。
<configuration>
<appSettings>
<add key="AuthCookie" value=".ASPNETFRM" />
</appSettings>
<system.web>
<authentication mode="Windows" />
</system.web>
</configuration>
这样设置后,用户需要具有有效的NTFS权限才能访问Authentication文件夹和Login.aspx页面。不需要限制对这些文件的访问,只需确保所有用户都能访问它们。
Forms身份验证的默认行为是,网站中的每个应用程序都会收到一个用于加密cookie值的唯一加密密钥。因为需要在Authentication应用程序中创建的cookie在网站的所有其他应用程序中都有效,所以需要关闭这种行为。
在根应用程序的web.config文件中添加额外的条目:
<system.web>
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
</system.web>