【问题标题】:Allow public access to controller action in WebForms + MVC site允许公共访问 WebForms + MVC 站点中的控制器操作
【发布时间】:2011-01-05 12:23:52
【问题描述】:

我有一个旧的 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

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

【问题讨论】:

  • 你能举一个你正在尝试的位置元素和路线的例子吗?两者之间的不匹配似乎是最可能的原因。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那么还有其他原因导致您的问题。默认情况下,操作是公开的;直到你用 Authorize 装饰它(或它的类),它们才会受到保护。您可能需要发布 web.config 的各个部分以帮助我们为您提供答案(身份验证元素,可能是您拥有的任何授权元素)。
    • 研究了一整天后,我发现与此相矛盾的陈述。据我了解,OOB 一个 MVC 站点是开放的,但一个 WebForms 站点不是。看起来不同之处在于 web.config 中的授权配置。我对此感到非常困惑,因为很多人都在说相互矛盾的事情,包括 MS 论坛中的 MVP。
    • 我从来没有让 WebForms 或 MVC 项目开箱即用。不过,没有什么能阻止某人创建自己的项目模板,因此可能会有一些他们一开始就受到保护的地方。
    • 对。我的观点是,这是一个已经配置了 UrlAuthorization 的现有 WebForms 项目,因此 URL 被锁定,因为我什至可以通过 IAuthorizationFilter (即 Authorize 属性或控制器 OnAuthorize)来让控制器授权。
    • 您能否更改您的路径,使 MVC 路由与各种 Web 表单页面的 URL 不匹配?
    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2010-10-16
    • 2021-11-21
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多