max*_*oin 1 c# asp.net authorization asp.net-core
我想允许具有“管理员”角色的用户隐式访问每个资源。
考虑这个例子:
[Authorize(Role = "BusinessOwner")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Run Code Online (Sandbox Code Playgroud)
必须明确设置角色“Admin”。将所有角色添加到 admin 用户不是一种选择,因为角色可以(读取意愿)随时间变化。
[Authorize(Role = "Admin, BusinessOwner")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Run Code Online (Sandbox Code Playgroud)
不建议再创建自定义AuthorizeAttribute,那么在 .NET Core 2 中绕过授权检查并允许管理员访问的最佳实践是什么?
我从这个答案中得到了很大的启发:https : //stackoverflow.com/a/38773345/3878764。
如果管理员有权访问所有内容,则您无需在每个操作上明确检查此授权逻辑。您只需要检查已经受到限制的操作 - 管理员角色将绕过限制。
因此,例如,如果您使用基于策略的授权,您可以编写一个 Base AuthorizationHandler,如果找到 admin 角色,它将短路逻辑。
public abstract class RequirementHandlerBase<T> : AuthorizationHandler<T> where T : IAuthorizationRequirement
{
protected sealed override Task HandleRequirementAsync(AuthorizationHandlerContext context, T requirement)
{
//if admin then short-circuit with success
if (context.User.IsInRole("Admin"))
{
context.Succeed(requirement);
return Task.FromResult(true);
}
return HandleAsync(context, requirement);
}
protected abstract Task HandleAsync(AuthorizationHandlerContext context, T requirement);
}
Run Code Online (Sandbox Code Playgroud)
让您的所有处理程序都从基础派生:
public class AgeRequirementHandler : RequirementHandlerBase<AgeRequirement>
{
protected override HandleAsync(AuthorizationHandlerContext context, AgeRequirement requirement)
{
...
}
}
public class AgeRequirement : IRequrement
{
public int MinimumAge { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后像往常一样注册:
services.AddAuthorization(options =>
{
options.AddPolicy("Over18",
policy => policy.Requirements.Add(new AgeRequirement { MinimumAge = 18 }));
});
Run Code Online (Sandbox Code Playgroud)
此外,有关基于策略的角色检查的此文档可能很有用:https : //docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view= aspnetcore-2.2#policy-based- role-检查
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |