具有表单身份验证的Web API匿名服务访问

时间:2012-12-24 05:53:58

标签: asp.net web-config asp.net-web-api forms-authentication

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

<授权>
<! - 拒绝所有匿名用户 - >
< 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;

        }

    }
}

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

&lt; location path =“Controllers”&gt;
&LT;&的System.Web GT;
&LT;授权&GT;
&lt; allow users =“*”/&gt;
&LT; /授权&GT;
&LT; /system.web>
&LT; /地点&gt;

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

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

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

..是的 - 小心;)