AuthorizationPolicy和AuthorizationFilter都是ASP.NET Core中用于处理授权的两种方式。它们的主要区别在于:
AuthorizationPolicy在处理授权时根据策略进行决策,而AuthorizationFilter直接检查请求上的授权信息。
AuthorizationPolicy是通过全局配置和控制器或动作方法上的[Authorize]特性进行配置的,而AuthorizationFilter可以在任何地方添加。
下面是一个演示如何在ASP.NET Core中使用AuthorizationPolicy和AuthorizationFilter的代码示例:
授权策略 在Startup.cs中,可以通过调用services.AddAuthorization()方法来添加授权服务并配置全局策略:
// Startup.cs public void ConfigureServices(IServiceCollection services) { // ...
services.AddAuthorization(options => { options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin")); });
// ... }
然后,您可以在控制器或操作方法上应用[Authorize]属性,并通过名称或策略指定要求授权的角色:
// MyController.cs [Authorize(Roles = "Admin")] public class MyController : ControllerBase { // ...
[Authorize(Policy = "RequireAdminRole")] public IActionResult MyAction() { // ... }
// ... }
授权过滤器 AuthorizationFilter可以通过实现IAuthorizationFilter接口并应用[Authorize]特性来创建。还可以在Filter中注入其他服务来实现更高级的逻辑。
下面是一个AuthorizationFilter的示例:
// MyAuthorizationFilter.cs public class MyAuthorizationFilter : IAuthorizationFilter { private readonly IMyService _myService;
public MyAuthorizationFilter(IMyService myService) { _myService = myService; }
public void OnAuthorization(AuthorizationFilterContext context) { if (_myService.HasPermission(context.HttpContext.User)) { // User has permission } else { // User does not have permission context.Result = new ForbidResult(); } } }
要应用此过滤器,请在控制器或操作方法上使用[Authorize]特性,并添加指向MyAuthorizationFilter类的引用:
// MyController.cs [Authorize(Roles = "Admin")] [TypeFilter(typeof(MyAuthorizationFilter)] public class MyController : ControllerBase { // ... }
需要注意的是,如果在策略和过滤器中都定义了相同的规则,将会优先使用策略的规则。