1

我有一个旧的 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 中指定)。我没有在任何这些控制器操作上使用授权属性。

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

编辑:

我想明确说明我正在对我想要保护的操作使用 [Authorize]。我想公开的问题中的操作没有使用 [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
        );

以及失败的 URL:

http://localhost/MyWebApp/WC/42

我实际上有一个更通用的路线来处理这个问题,但添加了这个以消除任何疑问。无论如何,这在登录时都可以正常工作。

4

2 回答 2

0

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

于 2011-01-04T20:15:44.157 回答
0

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

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

于 2011-01-04T20:19:56.293 回答