首页 文章

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

提问于
浏览
2

我正在尝试确定如何在表单身份验证下配置对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中允许的列表中:

<location path = "Controllers"> 在<system.web> <授权> <allow users = "*" /> </授权> </system.web> </位置>

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

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

2 回答

  • 5

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

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

  • 0

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

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

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

    ..是的 - 小心;)

相关问题