2

我正在尝试确定如何在表单身份验证下配置对 Web API 控制器服务的访问。如果我通过添加授权元素添加授权配置以拒绝所有匿名用户:

<authorization>
   <!-- 拒绝所有匿名用户 -->
   <deny users="?" />
</授权>

只能按预期访问登录页面。但我也想访问从控制器返回的列表。我将 [AllowAnonymous] 属性添加到一个简单的服务,该服务返回用于填充下拉菜单的值。例如:

namespace WebAPI.Controllers
{
    public class RegisterController : ApiController
    {
        [AllowAnonymous]
        public List<ListElement> GetActivitiesList()
        {
            List<ListElement> li = new List<ListElement>();

            li.Add(new ListElement() { Id = 1, Text = "Item 1" });
            li.Add(new ListElement() { Id = 2, Text = "Item 2" });
            li.Add(new ListElement() { Id = 3, Text = "Item 3" });

            return li;

        }

    }
}

我将控制器目录添加到 web.config 中的允许列表中:

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

如果我浏览示例页面以调用控制器,即使我添加了 [AllowAnonymous] 属性,表单身份验证仍会通过 302 重定向拒绝访问登录页面。如果我删除整个站点的授权元素“<deny users="?" />”,我可以使用 [Authorize] 和 [AllowAnonymous] 属性控制访问。

目标是能够在几个页面上为匿名用户使用特定服务(如注册),而其余的站点访问仅限于经过身份验证的用户。访问服务与访问文件并不完全相同,所以我的猜测是我必须为这种情况编写一个特殊的处理程序,但我不确定如何去做。

4

2 回答 2

5

首先,当您使用 ASP.NET MVC 时,不要使用老式的 ASP.NET 允许/拒绝机制来控制访问。我不认为这是受支持的,并且可能会在您的站点(源代码)中创建安全漏洞。在 ASP.NET MVC 中控制访问的正确方法是在您的问题中提到的控制器类和/或方法上使用 [Authorize] 和 [AllowAnonymous] 属性。

如果你想让你的整个应用程序除了一对夫妇之外的每个方法都需要登录,你可以将类级别的 [Authorize] 属性应用于所有控制器,然后在方法级别应用 [AllowAnonymous] 属性对于那些不需要身份验证的方法。还有一种编写 FilterProvider 的方法,它会以编程方式自动将 [Authorize] 属性应用到任何尚未应用此类属性的控制器。这很方便,因为这样您就不会意外忘记应用 [Authorize] 属性。看这篇文章有关如何执行此操作的详细信息。请注意,MVC4 中引入的 [AllowAnonymous] 属性与作者在文章中描述的自定义 [Public] 属性执行相同的功能。另请参阅这篇文章,其中讨论了一般保护 MVC 应用程序的内容。两篇文章都有点过时(2011 年),但基本思想仍然合理。

于 2012-12-24T06:28:00.290 回答
0

所以首先我们对应用程序的其余部分一无所知——是 MVC 还是 WebForms?

如果您的应用程序是 MVC,我完全同意 Brian 的观点,即您应该在所有控制器上使用 [Authorize] 和 [AllowAnoynmous]。

如果你不能这样做——你确实可以在规则中“打洞”——但你需要使用“真实”的 URL,比如

..是的 - 小心;)

于 2012-12-24T10:16:40.770 回答