使用AuthorizeAttribute进行ASP.NET Web API授权

时间:2012-03-02 10:13:49

标签: rest asp.net-web-api

使用新的ASP.NET Web API测试版。我似乎无法获得建议的用户身份验证方法。建议的方法似乎是,将[Authorize]过滤器添加到API控制器。例如:

[Authorize] 
public IEnumerable<Item> Get()
{
    return itemsService.GetItems();
}

但这并不像预期的那样有效。请求资源时,您将被重定向到登录表单。哪个不适合RESTful webapi。

我该如何处理?它在未来的版本中会有不同的用途吗?或者我应该回到实现自己的动作过滤器?

8 个答案:

答案 0 :(得分:93)

仔细检查您使用的是System.Web.Http.AuthorizeAttribute而不是System.Web.Mvc.AuthorizeAttribute。这个比特我以前。我知道WebAPI团队正试图将所有内容整合在一起,以便MVC用户熟悉它,但我认为有些事情是不必要的混淆。

答案 1 :(得分:4)

将您的身份验证模式设置为

<authentication mode="None" />
  

指定不进行身份验证。您的应用程序只需要匿名用户或应用程序提供自己的身份验证。

http://msdn.microsoft.com/en-us/library/532aee0e.aspx

当然,您必须通过标头或令牌或其他东西提供某种身份验证。您还可以指定 Windows 并使用内置的auth via标头。

如果此网站在API和需要表单设置的实际网页之间混合,那么您需要编写自己的处理。

所有属性都返回一个HttpUnauthorizedResult实例,重定向是在属性之外完成的,所以它不是问题,它是你的身份验证提供者。

答案 2 :(得分:3)

最后,我找到了一个解决方案: ASP.NET MVC 4 WebAPI authorization

本文介绍如何解决此问题。

答案 3 :(得分:2)

您正被重定向到登录页面,因为表单身份验证模块会自动执行此操作。要摆脱这种行为,请按照Paul的建议禁用表单身份验证。 如果要使用更多REST友好方法,则应考虑实施HTTP授权支持。 请查看此博文http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/

答案 4 :(得分:1)

ASP.NET 5引入了新的 Microsoft.AspNet.Authorization 系统,该系统可以保护两个 MVC和Web API控制器。

For more see my related answer here.

<强>更新

2年前的那个时候,它是Microsoft.AspNetCore.Authorization。

@Chris Haines指出。现在它存在 Microsoft.AspNetCore.Authorization。

从.NET核心1.0到2.0,我认为已经移动了许多名称空间。 并且.net经典和核心之间的传播功能是模糊的。 这就是微软推出.net标准的原因。

.net standard

答案 5 :(得分:0)

另外,看看我的回答: How to secure an ASP.NET Web API

我创建了一个NuGet包,您可以方便地使用它。

答案 6 :(得分:0)

如果您正在使用角色,请确保拼写正确:

如果您的角色被称为“管理员”,那么这个 - 例如将不起作用:

    [System.Web.Http.Authorize(Roles = "Administator")]

这也不会:

    [System.Web.Http.Authorize(Roles = "Administrators")]

糟糕...

答案 7 :(得分:0)

1,,gabriel,xyz_ltd,
2,,christian,abc_ltd,
1,,andrew,,UK
4,,mark,,France

使用

[授权(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

使用身份验证类型

进行过滤