我有一个在 .NET7 中开发的具有多个控制器的 API。现在所有操作都具有相同的授权策略,因此我们通过在 useendpoints 中间件中进行设置来完成它,如下所示
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute().RequireAuthorization("MyPolicy")
});
但现在我们正在尝试为 GET 和 POST 制定单独的策略。有没有一种方法可以动态实现此目的,而无需使用不同的 Authorize("Policy") 属性装饰每个方法。 预先感谢您
为您提供的解决方法: 创建路线约束:
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" });