首页 文章

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

提问于
浏览
59

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

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

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

我该怎么办呢?它在未来的版本中会有不同的工作吗?或者我应该回到实现我自己的动作过滤器?

8 回答

  • 0

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

  • 3

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

    <authentication mode="None" />
    

    无指定无身份验证 . 您的应用程序只需要匿名用户或应用程序提供自己的身份验证 .

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

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

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

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

  • 0

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

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

  • 0

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

  • 2

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

    For more see my related answer here.

    Update:

    那个时候2年前是微软.AspNetCore.Authorization .

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

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

    .net standard

  • 1

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

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

  • 93

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

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

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

    这也不会:

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

    糟糕!

  • 4
    [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)]

    使用身份验证类型过滤

相关问题