【问题标题】:ASP.NET Web API Authorization with AuthorizeAttribute使用 AuthorizeAttribute 的 ASP.NET Web API 授权
【发布时间】:2012-03-20 20:22:10
【问题描述】:

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

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

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

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

【问题讨论】:

标签: rest asp.net-web-api


【解决方案1】:

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

【讨论】:

  • 是的,我认为这是首选方法,没有意识到他们引入了全新的属性类层次结构,我同意,令人困惑......
  • 是的,他们应该在每个“Hello World”示例前加上关于 MVC 与 Web Api 不同命名空间的免责声明
  • 是的,System.Web.Http != System.Web.Mvc
  • 太好了,很高兴我在四处搜索了一个小时后找到了这个。
【解决方案2】:

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

<authentication mode="None" />

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        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 core 1.0 到 2.0 已经移动了许多命名空间。 .net 经典和核心之间的传播功能是模糊的。 这就是微软引入 .net 标准的原因。

        .net standard

        【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

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

          这也不会:

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

          哎呀...

          【讨论】:

            【解决方案8】:
            [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)));
            }
            

            使用

            [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

            使用身份验证类型过滤

            【讨论】:

              猜你喜欢
              • 2016-12-29
              • 2019-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-12
              • 2014-07-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多