将[Authorize]属性隐式应用于所有Web API控制器

时间:2014-02-20 18:49:11

标签: c# .net asp.net-web-api asp.net-web-api2

我的应用程序已设置,其中除登录之外的所有请求必须使用Web API中的授权属性进行“授权”。 E.g。

 [Authorize]
 [HttpGet, Route("api/account/profile")]
 public ApplicationUser Profile()
 {
       return userModel;
 }

并且只有登录才需要授权,因为你获得令牌的那些;)

[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
   ....
}

而不是必须将[Authorize]属性添加到我的所有路由中,有没有办法全局设置它?

4 个答案:

答案 0 :(得分:46)

您有两个选择

  1. 通过使用authorize属性修饰控制器来控制器级别。

    [Authorize]
    [RoutePrefix("api/account")]
    public class AccountController : ApiController
    {
    
  2. 您还可以在WebApiConfig.cs文件的Register方法中将其全局级别设置为所有路径

     config.Filters.Add(new AuthorizeAttribute());
    

答案 1 :(得分:21)

您可以将AuthorizeAttribute设置为WebApiConfig文件,如下所示:

public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
  );
  config.Filters.Add(new AuthorizeAttribute());
}

现在,您的Web Api控制器中的所有方法都需要授权。如果要删除方法的此授权要求,则需要像登录操作方法一样添加属性[AllowAnonymous]

答案 2 :(得分:1)

我只想在其他答案中添加一些内容,如果您使用

 filters.Add(container.Resolve<AuthorizeAttribute>());

然后,如果有需要,您还可以将所有依赖项注入属性

答案 3 :(得分:1)

在ASP.NET Core Web API中,就像这样:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(o =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();

        o.Filters.Add(new AuthorizeFilter(policy));
    });
}

来源:https://joonasw.net/view/apply-authz-by-default