ASP.NET:如果不使用Membership API,如何将资源文件(例如jpg)限制为某些角色?

时间:2012-06-16 01:18:30

标签: asp.net

很容易限制对aspx页面的访问,只需在代码隐藏中使用角色检查逻辑。但像照片这样的资源文件没有放置角色检查逻辑的代码,那么如何限制访问呢?

1 个答案:

答案 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中使用locationauthorization

   <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模块。所以,我的答案是恰当的。