.net 自定义授权处理程序

.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

posted @ 2023-11-17 17:37  fish3.yu  阅读(54)  评论(0)    收藏  举报