根据Http Method对API应用不同的授权策略

问题描述 投票:0回答:1

我有一个在 .NET7 中开发的具有多个控制器的 API。现在所有操作都具有相同的授权策略,因此我们通过在 useendpoints 中间件中进行设置来完成它,如下所示

app.UseEndpoints(endpoints =>
{   
    endpoints.MapDefaultControllerRoute().RequireAuthorization("MyPolicy")
});

但现在我们正在尝试为 GET 和 POST 制定单独的策略。有没有一种方法可以动态实现此目的,而无需使用不同的 Authorize("Policy") 属性装饰每个方法。 预先感谢您

authorization asp.net-core-webapi asp.net-mvc-routing
1个回答
0
投票

为您提供的解决方法: 创建路线约束:

public class NotPostConstraint : IRouteConstraint
    {
        

        public bool Match(
            HttpContext? httpContext, IRouter? route, string routeKey,
            RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (httpContext?.Request.Method == HttpMethod.Post.Method)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }

在您的program.cs中进行如下配置:

builder.Services.AddRouting(options =>
{
    options.ConstraintMap.Add("notpost", typeof(NotPostConstraint));
    
});
......
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action:notpost}/{id?}",
        defaults: new { controller = "Home", action = "Index" }
        );
    
    app.MapControllerRoute(
        name: "default2",
        pattern: "{controller}/{action}/{id?}",
        defaults: new {controller="Home",action="Index"}
        ).RequireAuthorization(new AuthorizeAttribute() {AuthenticationSchemes="Cookies",Policy="MyPolicy" });
© www.soinside.com 2019 - 2024. All rights reserved.