限制对 aspx 页面的访问很容易,只需在代码隐藏中使用角色检查逻辑即可。但是像照片这样的资源文件并没有代码来放置角色检查逻辑,那么如何限制访问呢?
1 回答
首先,您需要设置 IIS。如果您有 IIS7+,那就轻而易举了。将您的应用程序池从 Classic 更改为 Integrated Pipeline。这允许将托管模块和处理程序应用于您的静态资源文件。如果您使用的是 IIS6,请参阅这篇文章。
其次,您可能需要在 web.config 中确保此设置(对于 IIS7):
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
FormsAuth 之类的东西现在应该与 ASPX 等一样工作,这意味着您只能通过使用 web.config 来限制授权用户的路径(例如)。
更新
回应以下光圈的评论:
除了使用 之外RoleProviders
,ASP.NET 可以通过在使用 Windows 身份验证时读取用户所属的组来确定主体的角色,或者通过替换应用程序中的当前 IPrincipal 来手动更改角色,最好是在AuthenticateRequest
.
Global.asax.cs
public void Application_AuthenticateRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
var context = application.Context;
if (!context.User.Identity.IsAuthenticated) return; // if the user hasn't been authenticated by another module such as FormsAuth, don't do anything further
string[] roleNames = FindRolesForUser(context.User.Identity.Name); // this method you will create to figure out what roles the specified user has
context.User = new GenericPrincipal(new GenericIdentity(context.User.Identity.Name), roleNames); // updates the current principal.
}
现在,就检查我们上面指定的角色而言,有很多方法。您可以创建一个自定义 HttpModule 来查找以 JPG、GIF、JS 等结尾的路径,然后简单地检查context.User.IsInRole
. 您也可以简单地在 web.config 中使用location
和:authorization
<location path="images">
<system.web>
<authorization>
<allow users="?"/> <!-- or perhaps <allow roles="Admins" /> it's up to you -->
</authorization>
</system.web>
</location>
底线是,在您配置集成管道或将静态资源映射到 ASP.NET ISAPI 模块之前,您无法在请求静态资源期间执行任何托管代码。所以,我的回答是恰当的。