1

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

4

1 回答 1

2

首先,您需要设置 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 模块之前,您无法在请求静态资源期间执行任何托管代码。所以,我的回答是恰当的。

于 2012-06-16T01:55:43.610 回答