允许公共访问WebForms + MVC站点中的控制器操作

时间:2011-01-04 19:53:34

标签: c# asp.net-mvc webforms asp.net-authorization

我有一个传统的ASP.Net网站,我正在整合MVC。我在web.config中使用webforms身份验证和标准授权标记:

<authorization>
  <deny users="?"/>
</authorization>

我过去可以使用以下位置公开各种文件夹:

<location path="Public">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

随着MVC和一些控制器的增加,我需要完全公开一些控制器动作。但是,我无法使用web.config中的位置标记执行此操作。如果我在未经过身份验证的情况下尝试转到操作的URL,ASP.Net会将我重定向回我的登录页面(在web.config中指定)。我没有在任何这些控制器操作上使用Authorization属性。

如何在破坏安全性的情况下打开对所有需要保护的所有网络表单的访问?

编辑:

我想明确表示我正在使用[授权]我想要保护的操作。我希望公开的问题中的操作不使用[Authorize]属性,除非已登录,否则仍无法访问。

编辑2:

我已经完成了一些IIS跟踪,并认为我已经说服自己这确实是身份验证失败,而不是其他一些错误。以下是我尝试访问的位置和路线的示例:

<location path="WC">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

路线:

routes.MapRoute(
          "WC", // Route name
          "WC/{id}",
          new { action = "GetWC", controller = "WC" } // URL with parameters
        );

失败的网址:

http://localhost/MyWebApp/WC/42

我实际上有一个更通用的路由处理这个,但添加了这个以消除任何疑问。在任何情况下,登录都可以正常工作。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用ActionFilterAttribute将某些方法装饰为需要身份验证,同时让控制器本身可以公开查看。

答案 1 :(得分:0)

使用System.Web.Mvc.AuthorizeAttribute。您可以使用它来装饰控制器类本身(这将导致所有操作方法受到保护),或者您可以修改操作方法本身以实现更精细的颗粒控制。

如果两者都没有装饰,那么所有用户都可以调用它们(包括匿名用户)。如果您只使用[Authorize],则只有授权用户才能调用操作方法。您还可以传入逗号分隔的角色列表,以指定用户必须至少具有其中一个角色的列表才能调用操作方法。