很容易限制对aspx页面的访问,只需在代码隐藏中使用角色检查逻辑。但像照片这样的资源文件没有放置角色检查逻辑的代码,那么如何限制访问呢?
答案 0 :(得分:2)
首先,您需要设置IIS。如果你有IIS7 +,那就很容易了。将您的应用程序池从Classic更改为Integrated Pipeline。这允许将受管模块和处理程序应用于静态资源文件。如果您使用的是IIS6,see this article。
其次,您可能需要在web.config(对于IIS7)中确保此设置:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
FormsAuth之类的东西现在应该和ASPX等一样,这意味着你只能通过使用web.config(例如)来限制授权用户的路径。
<强>更新强>
回应Aperture的评论如下:
在使用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模块。所以,我的答案是恰当的。