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

Joh*_*ohn 2 asp.net forms-authentication web-config asp.net-web-api

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

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

只能按预期访问登录页面.但我还想访问从控制器返回的列表.我将[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;

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Bri*_*ers 5

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

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