对区域内的所有控制器应用授权过滤器
Apply Authorize filter on all controllers within an area
如何强制授权一个区域内的所有控制器?具体来说,我想配置一个 AuthorizeFilter
作为 Startup.ConfigureServices()
方法的一部分应用于 'admin' 区域。
一种方法是使用自定义 IControllerModelConvention
public class AuthorizeAreaConvention : IControllerModelConvention
{
private readonly string _area;
private readonly string _policy;
public AuthorizeAreaConvention(string area, string policy)
{
_area = area;
_policy = policy;
}
public void Apply(ControllerModel controller)
{
if (controller.Attributes.Any(a =>
a is AreaAttribute && (a as AreaAttribute).RouteValue.Equals(_area, StringComparison.OrdinalIgnoreCase))
|| controller.RouteValues.Any(r =>
r.Key.Equals("area", StringComparison.OrdinalIgnoreCase) && r.Value.Equals(_area, StringComparison.OrdinalIgnoreCase)))
{
controller.Filters.Add(new AuthorizeFilter(_policy));
}
}
}
然后在你的Startup.ConfigureServices()
方法中,你可以添加:
services.AddMvc(options =>
{
options.Conventions.Add(
new AuthorizeAreaConvention("Admin", Policy.AdministratorPolicy));
});
其中 Policy.AdministratorPolicy
只是一个字符串常量(例如 "AdministratorPolicy"
),在应用 StartUp
中注册如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(o =>
{
o.AddPolicy(Policy.AdministratorPolicy, b =>
{
b.RequireAuthenticatedUser();
b.RequireClaim(ClaimTypes.Role, Roles.Admin);
});
});
// Add framework services.
services.AddMvc();
// ... Omitted for brevity
}
在上面,Roles.Admin
只是一个字符串常量(例如"Admin"
)。
如何强制授权一个区域内的所有控制器?具体来说,我想配置一个 AuthorizeFilter
作为 Startup.ConfigureServices()
方法的一部分应用于 'admin' 区域。
一种方法是使用自定义 IControllerModelConvention
public class AuthorizeAreaConvention : IControllerModelConvention
{
private readonly string _area;
private readonly string _policy;
public AuthorizeAreaConvention(string area, string policy)
{
_area = area;
_policy = policy;
}
public void Apply(ControllerModel controller)
{
if (controller.Attributes.Any(a =>
a is AreaAttribute && (a as AreaAttribute).RouteValue.Equals(_area, StringComparison.OrdinalIgnoreCase))
|| controller.RouteValues.Any(r =>
r.Key.Equals("area", StringComparison.OrdinalIgnoreCase) && r.Value.Equals(_area, StringComparison.OrdinalIgnoreCase)))
{
controller.Filters.Add(new AuthorizeFilter(_policy));
}
}
}
然后在你的Startup.ConfigureServices()
方法中,你可以添加:
services.AddMvc(options =>
{
options.Conventions.Add(
new AuthorizeAreaConvention("Admin", Policy.AdministratorPolicy));
});
其中 Policy.AdministratorPolicy
只是一个字符串常量(例如 "AdministratorPolicy"
),在应用 StartUp
中注册如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(o =>
{
o.AddPolicy(Policy.AdministratorPolicy, b =>
{
b.RequireAuthenticatedUser();
b.RequireClaim(ClaimTypes.Role, Roles.Admin);
});
});
// Add framework services.
services.AddMvc();
// ... Omitted for brevity
}
在上面,Roles.Admin
只是一个字符串常量(例如"Admin"
)。