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

wb1gzix0  于 2023-06-07  发布在  .NET
关注(0)|答案(6)|浏览(209)

我的应用程序设置为除了登录之外的所有请求都必须使用Web API中的授权属性进行“授权”。例如

[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]属性,而不是必须将[Authorize]属性添加到所有路由中?

fcy6dtqo

fcy6dtqo1#

你有两个选择
1.控制器级别,通过使用authorize属性装饰您的控制器。

[Authorize]
[RoutePrefix("api/account")]
public class AccountController : ApiController
{

1.您还可以在WebApiConfig.cs文件的Register方法中将其设置为全局级别的所有路由

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

nvbavucw2#

您可以将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],就像Login操作方法中那样。

eulz3vhy

eulz3vhy3#

自ASP.NET Core 3.0以来,有一种新的方法可以通过使用端点路由中间件来实现此操作,而无需过滤器,请参阅:https://learn.microsoft.com/en-gb/aspnet/core/migration/22-to-30?view=aspnetcore-5.0&tabs=visual-studio#authorization
您需要添加以下内容(如果尚未存在):

services.UseAuthentication(); // with authentication scheme
app.UseAuthentication();
app.UseAuthorization(); // this is enough, because DefaultPolicy is to require authentication

以及端点中间件:

endpoints.MapControllers().RequireAuthorization();

JWT身份验证方案的示例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.SaveToken = true;
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidateAudience = false,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
         };

    });
}
   

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();
    
    app.UseAuthentication();
    
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers().RequireAuthorization();
    });
}

您仍然可以在控制器或操作上使用[AllowAnonymous]允许匿名访问(例如:用于用户登录)。

cidc1ykv

cidc1ykv4#

在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

polkgigr

polkgigr5#

我只是想在其他答案中添加一些东西如果你用

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

然后如果有需要,你也可以将所有依赖注入到你的属性中

4ktjp1zp

4ktjp1zp6#

我使用另一种方法-因为我所有的ApiController类都是从我自己的自定义类ControllerBase派生的,所以我只是将我的自定义属性[RequireAuthorization]设置为这个基类。所以这会被继承到所有派生的控制器类。

相关问题