60

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

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

但是,这并没有按预期工作。请求资源时,您会被重定向到登录表单。这不太适合 RESTful webapi。

我应该如何处理这个?在未来的版本中它会以不同的方式工作吗?还是我应该回退到实现自己的操作过滤器?

4

8 回答 8

96

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

于 2012-03-02T23:34:11.970 回答
4

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

<authentication mode="None" />

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

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

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

如果此站点在 API 和需要Forms设置的实际页面之间混合使用,那么您将需要编写自己的处理方式。

属性所做的只是返回一个HttpUnauthorizedResult实例,重定向是在属性之外完成的,所以这不是问题,它是您的身份验证提供程序。

于 2012-03-02T13:13:56.237 回答
3

最后,我在以下位置找到了解决方案: ASP.NET MVC 4 WebAPI 授权

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

于 2012-03-14T13:46:32.517 回答
2

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

于 2012-05-21T09:45:04.700 回答
1

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

有关更多信息,请参见我的相关答案。

更新:

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

正如@Chris Haines 指出的那样。现在它驻留在 Microsoft.AspNetCore.Authorization 上。

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

.net 标准

于 2016-02-15T10:54:29.020 回答
0

另外,请查看我的答案: 如何保护 ASP.NET Web API

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

于 2013-05-20T03:55:32.257 回答
0

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

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

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

这也不会:

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

哎呀...

于 2015-11-22T23:22:46.973 回答
0
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Produces("application/json")]
[Route("api/[controller]")]
public class CitiesController : Controller
{
        [HttpGet("[action]")]
        public IActionResult Get(long cityId) => Ok(Mapper.Map<City, CityDTO>(director.UnitOfWork.Cities.Get(cityId)));
}

采用

[授权(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

使用身份验证类型过滤

于 2018-05-28T10:45:21.193 回答