.net 自定义授权处理程序
Authorization——授权
.NET里提供了授权框架,允许开发者编写自己的授权规则,当一个请求到达控制器Action时,用它来判断该请求是否能够继续执行该控制器Action。
例如:发表一条评论,需要用户登录后才能发表,那么就使用Authorization来判断该请求是否携带用户登录信息,如果没有则不能发布。下面我们来编写一个授权规则,该规则规定,只能是管理员(admin)才能访问Action。
首先需要了解两个接口interface:
namespace Microsoft.AspNetCore.Authorization
{
/// <summary>
/// Represents an authorization requirement.
/// 摘要:无方法的标记服务,以及用于跟踪授权是否成功的机制
/// </summary>
public interface IAuthorizationRequirement
{
}
/// <summary>
/// Classes implementing this interface are able to make a decision if authorization is allowed.
/// </summary>
public interface IAuthorizationHandler
{
/// <summary>
/// Makes a decision if authorization is allowed.
/// </summary>
/// <param name="context">The authorization information.</param>
Task HandleAsync(AuthorizationHandlerContext context);
}
}
接口 IAuthorizationRequirement 表示授权的要求。我们来写一个类,实现这个接口:
/// <summary>
/// 这个接口没有任何参数,仅仅表示要求是管理员,现在没有任何用处
/// 所以我们需要写一个处理程序来实现这个要求
/// </summary>
public class IsAdministratorRequirement : IAuthorizationRequirement
{
}
接口 IAuthorizationHandler 用于实现如何检查要求,我们可以使用已经实现了该接口的抽象类 AuthorizationHandler,写一个新的类来继承该抽象类:
/// <summary>
/// 这个类继承了抽象类 AuthorizationHandler,它的泛型参数规定了要处理哪个要求
/// </summary>
public class IsAdministratorHandler : AuthorizationHandler<IsAdministratorRequirement>
{
// 处理逻辑就写在这个方法里
protected override Task HandleRequirementAsync
(AuthorizationHandlerContext context, IsAdministratorRequirement requirement)
{
}
}
HandleRequirementAsync (AuthorizationHandlerContext context, IsAdministratorRequirement requirement)方法中,参数 context 携带了用户信息 ClaimsPrincipal,可以通过获取 context.User 来获取到当前请求中携带的用户信息。
var user = context.User;
怎样表示授权成功或失败
在处理方法 HandleRequirementAsync 中,调用
// 视为授权成功
context.Succeed(requirement);
// 视为授权失败,就算在这之前执行过 context.Succeed(requirement) 也视为失败
context.Fail();
配置为授权策略
在 ConfigureServices 中配置授权策略,如下:
// 添加授权处理程序 IsAdministratorHandler
services.AddSingleton<IAuthorizationHandler, IsAdministratorHandler>();
//给该授权要求一个策略名
services.AddAuthorizationCore(options =>
{
options.AddPolicy("授权策略名", policy => policy.Requirements.Add(new IsAdministratorRequirement()));
});
配置以上我们就可以通过策略名来使用这个策略了。我们直接在需要的控制器、Action上配置特性
[Authorize(policy: "授权策略名")]
public class AdministratorController
{
}
如上,如果该策略授权成功,则继续执行接下来的代码,如果失败,则会直接返回401响应状态码。
参考:https://www.cnblogs.com/myfor/p/13804292.html
标签:requirement,自定义,接口,处理程序,context,授权,net,public From: https://www.cnblogs.com/fish3yu/p/17839236.html