首页 > 编程语言 >.net 自定义授权处理程序

.net 自定义授权处理程序

时间:2023-11-17 17:44:41浏览次数:39  
标签:requirement 自定义 接口 处理程序 context 授权 net public

.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

相关文章

  • .NET|--问题集锦|--调试报错,进行了无法编译的编辑,在修复编译错误之前,将无法应用更
    前言相关版本信息#VisualStudio版本MicrosoftVisualStudioProfessional2022(64位)报错信息#生成项目的时候不会报错,但是调试的时候还会报错,ENC1002 无法应用更改-意外错误:“Readoutofbounds.”解决方案VisualStudio菜单栏|--{工具}|--{选......
  • .NET处理线程安全的方法、类和解决方案
    使用锁机制:Monitor类:提供了Enter和Exit方法,可以使用Monitor.Enter(obj)锁定一个对象,使用Monitor.Exit(obj)释放锁。lock关键字:C#中的lock关键字会自动创建一个Monitor锁,确保在同一时间只有一个线程可以进入被lock包裹的代码块。使用互斥体(Mutex):Mutex类:提供了WaitOne......
  • vue-富文本/自定义上传图片
    1、下载组件npminstallvue-quill-editor–D2、在需要的组件内引入富文本import{quillEditor}from'vue-quill-editor'import'quill/dist/quill.core.css'import'quill/dist/quill.snow.css'import'quill/dist/quill.bubble.css'com......
  • Core 6.0 webapi ‘报错InvalidOperationException:无法解析“ Microsoft.AspNetCore.H
    因接口版本升级并使用core6.0却发现HttpContext.Current.Request用不了 所以在网上找了半天说是使用Microsoft.AspNetCore.Http.IHttpContextAccessorprivateIHttpContextAccessor_httpContextAccessor;publicWebHelper(IHttpContextAccessorhttpContextAccessor......
  • 新版本 el-input 不支持 v-model.trim,自定义指令去除首尾空格
    问题场景<el-inputtype="textarea"v-model.trim="value"/>多行文本输入框无法换行。经测试,去掉.trim修饰符后,就可正常换行了。从官网文档,发现element-ui新版本不支持v-model修饰符。因此,若在新版本的element-ui的el-input中使用v-model.trim,会发生以下问题......
  • Dapper NetCore 分区实战
    在上一篇中介绍了基于Dapper的NetCore分表,本篇旨在介绍基于Dapper的NetCore分区,废话不多说开搞吧!模拟业务场景:基于公司所在地区对表建立分区设计公司表结构,其中TableAttribute标识表名,PartitionAttribute标识当前表是分区结构,Property代表按照某个属性分区publicabstractc......
  • Spring Boot 自定义注解,AOP 切面统一打印出入参请求日志
    今天主要说说如何通过自定义注解的方式,在SpringBoot中来实现AOP切面统一打印出入参日志。小伙伴们可以收藏一波。废话不多说,进入正题!一、先看看切面日志输出效果在看看实现方法之前,我们先看下切面日志输出效果咋样:从上图中可以看到,每个对于每个请求,开始与结束一目了然,并且打印......
  • Decoupling the Depth and Scope of Graph Neural Networks
    目录概符号说明Shadow-GNN代码ZengH.,ZhangM.,XiaY.,SrivastavaA.,MalevichA.,KannanR.,PrasannaV.,JinL.andChenR.Decouplingthedepthandscopeofgraphneuralnetworks.NIPS,2021.概为每个结点抽取一子图作为结点的代表,然后推理过程仅限定在子......
  • MAUI + MASA Blazor .NET8 升级指南
    目录前言准备1、首先确保已经将VS升级到VisualStudio202217.8版本以上。2、下载安装.NET8.0升级项目1、将项目的目标.NET运行时修改为net8.02、添加依赖包引用3、升级依赖包4、升级Xcode5、测试打包前言Net8修复了MAUI中的很多Bug,还增加了很多新功能,例如:AndroidStripILAft......
  • 02_自定义Springboot starter
     创建springbootstarter 创建一个demostarter  创建配置类@Configuration@EnableConfigurationProperties(EmailProperties.class)@ConditionalOnBean(EmailEnable.class)publicclassEmailAutoConfiguration{static{System.out.println("Em......