首页 > 其他分享 >.net core手写一个授权策略

.net core手写一个授权策略

时间:2024-08-20 17:04:08浏览次数:10  
标签:core ClaimTypes public api User context net Type 手写

思路:.net core中鉴权成功后,表示可以登录进来call 网站api,但是哪些api可以call通,哪些api没有权限,则通过授权来控制

这里手写几个类型授权策略:

1:AdminPolicy: 角色必须为admin 的才能访问api 

2:  MutiPolicy :要求角色必须为admin,且用户名为liping,国家为china 的才能访问api 

3: EmailPolicy:要求用户邮箱是qq/gmail 的才能访问api 

4:DBPolicy:通过数据库查询,要求用户邮箱为qq 的才能访问api 

 1  public class CustomerAuthorizationConfig
 2  {
 3      public static void ConfigureServices(IServiceCollection services)
 4      {
 5          //手写一个授权方案
 6          services.AddAuthorization(options =>
 7          {
 8              //:要求角色必须为admin
 9              options.AddPolicy("AdminPolicy", pb =>
10              {
11                  pb.RequireRole("Admin");
12              });
13 
14 
15              //:要求角色必须为admin,且用户名为liping,国家为china
16              options.AddPolicy("MutiPolicy", p =>
17              {
18                  p.RequireRole("Admin")
19                  .RequireUserName("liping")
20                  .RequireAssertion(context =>
21                  context.User.Claims.FirstOrDefault(t => t.Type.Equals(ClaimTypes.Country))?.Value == "China");
22              });
23 
24 
25              //:多个组合条件校验
26              options.AddPolicy("EmailPolicy", p =>
27              {
28                  p.AddRequirements(new EmailRequirement());
29 
30              });
31 
32 
33              //:数据库查数据校验
34              options.AddPolicy("DBPolicy", p =>
35              {
36                  p.AddRequirements(new DBRequirement("@qq.com"));
37              });
38 
39 
40          });

             services.AddSingleton<IAuthorizationHandler, GmailHandler>();
             services.AddSingleton<IAuthorizationHandler, QQEmailHandler>();

41      }
42 
43      public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
44      {
45 
46          app.UseAuthorization();
47      }
48  }

 

2:邮箱策略:

 1  /// <summary>
 2  /// 实现登录用户邮箱是qq/gamil的校验
 3  /// 
 4  /// 自己做一个授权的策略(policy)
 5  /// 继承IAuthorizationRequirement接口
 6  /// </summary>
 7  public class EmailRequirement: IAuthorizationRequirement
 8  {
 9 
10  }
11 
12  public class QQEmailHandler : AuthorizationHandler<EmailRequirement>
13  {
14      protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, EmailRequirement requirement)
15      {
16          if(context.User!=null && context.User.HasClaim(t=>t.Type == ClaimTypes.Email))
17          {
18              var list = context.User.Claims.Where(t => t.Type == ClaimTypes.Email)?.ToList();
19              if (list.Any(t => t.Value.EndsWith("@qq.com", StringComparison.OrdinalIgnoreCase))) {
20 
21                  context.Succeed(requirement);
22              }
23              else
24              {
25                  //context.Fail();
26              }
27          }
28          return Task.CompletedTask;
29      }
30  }
31 
32  public class GmailHandler : AuthorizationHandler<EmailRequirement>
33  {
34      protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, EmailRequirement requirement)
35      {
36          if (context.User != null && context.User.HasClaim(t => t.Type == ClaimTypes.Email))
37          {
38              var list = context.User.Claims.Where(t => t.Type == ClaimTypes.Email)?.ToList();
39              if (list.Any(t => t.Value.EndsWith("@gmail.com", StringComparison.OrdinalIgnoreCase)))
40              {
41 
42                  context.Succeed(requirement);
43              }
44              else
45              {
46                  //context.Fail();
47              }
48          }
49          return Task.CompletedTask;
50      }
51  }

 

3:数据库策略

 1  /// <summary>
 2  /// 实现数据库的权限校验
 3  /// </summary>
 4  public class DBRequirement : AuthorizationHandler<DBRequirement>,IAuthorizationRequirement
 5  {
 6      public DBRequirement(string emailEndWith)
 7      {
 8          if (string.IsNullOrEmpty(emailEndWith))
 9          {
10              this.EmailEndWith = "@qq.com";
11          }
12          else
13          {
14              EmailEndWith = emailEndWith;
15          }
16         
17      }
18 
19      private string EmailEndWith { get; set; }
20      protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DBRequirement requirement)
21      {
22          if (context.User != null && context.User.HasClaim(t => t.Type == ClaimTypes.Email))
23          {
24              var list = context.User.Claims.Where(t => t.Type == ClaimTypes.Email)?.ToList();
25              if (list.Any(t => t.Value.EndsWith(EmailEndWith, StringComparison.OrdinalIgnoreCase)))
26              {
27 
28                  context.Succeed(requirement);
29              }
30              else
31              {
32                  //context.Fail();
33              }
34          }
35          return Task.CompletedTask;
36      }
37  }

 

 

4:如何调用

 1  public class AuthController : Controller
 2  {
 3      public IActionResult Index()
 4      {
 5          return View();
 6      }
 7 
 8 
 9      /// <summary>
10      /// 
11      /// </summary>
12      /// <returns></returns>
13      //[Authorize(Roles ="Admin,User")]//用户必须是admin/user角色
14      //[Authorize(Policy ="EmailPolicy")]// 满足EmailPolicy授权方案
15      //[Authorize(Policy = "AdminPolicy")] //满足AdminPolicy
16      //[Authorize(policy: "MutiPolicy")] //满足MutiPolicy策略
17      //[Authorize(policy: "DBPolicy")]
18      [Authorize]//登录的
19      public IActionResult Info()
20      {
21 
22          return View();
23      }
24 
25 } 
31  

 

标签:core,ClaimTypes,public,api,User,context,net,Type,手写
From: https://www.cnblogs.com/hanliping/p/18369833

相关文章

  • .net core 手写一个url的鉴权
    思路::在startup.cs的configservice中配置自定义鉴权方式,在界面使用该方式本章节实现一个简单的自定义鉴权:要求每个url后面要有参数UrlToken并且值为liping-123456,才可以访问成功,否则失败 1:配置一个自定义鉴权的文件1publicclassCustomerAuthenticationConfig2{3......
  • C# Deflate压缩字节数组(和java压缩结果一样)利用zlib.net对文件进行压缩
    今天在对接一个三方接口时,需要传一个附件数据,附件需要使用Deflate压缩算法压缩后的文件二进制流,再进行base64编码后的字符串。刚开始使用的官方自带的System.IO.Compression.DeflateStream方式,结果不管怎么改变CompressionLevel级别,压缩结果始终和java的压缩结果不一致,结果不一致......
  • .net core cookie 鉴权
    思路:在startup中的configservice设置cookie鉴权,在config方法中use鉴权,然后添加两个页面,一个登录页面,一个用户信息页面(登陆后才能访问,没有登录则返回失败或者需要登录) 1:添加一个cookie鉴权的方法1publicclassCookieAuthConfig2{3publicstaticvoidConfigureSe......
  • Visual Studio 2010旗舰版的VB.NET版本仓库库存管理系统的窗体应用程序
    PublicClassForm1'定义商品类ClassCommodityPublicNameAsStringPublicQuantityAsIntegerPublicPriceAsDoubleEndClass'商品列表PrivatecommoditiesAsNewList(OfCommodity)PrivateSubForm1_Load(senderAsObject,eAsEventA......
  • 神经网络之卷积篇:详解单层卷积网络(One layer of a convolutional network)
    详解单层卷积网络如何构建卷积神经网络的卷积层,下面来看个例子。已经写了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4×4矩阵。假设使用第一个过滤器进行卷积,得到第一个4×4矩阵。使用第二个过滤器进行卷积得到另外一个4×4矩阵。最终各自形成一个卷积神经网络......
  • 【Kubernetes】 它是什么?为什么要拥抱它?
    1.什么是Kubernetes?Kubernetes是一个开源的容器集群管理系统,旨在自动化部署、扩展和管理容器化应用程序。‌它由Google开发,并现已成为云原生计算基金会(CNCF)管理的项目,是首个从CNCF毕业的项目,同时也是历史上增长最快的开源项目之一。Kubernetes的设计目的是简化容器化应用......
  • 【Altium】AD-元件类型Net Tie对PCB布线的影响
    【更多软件使用问题请点击亿道电子官方网站】1、文档目标创建元器件库时将元件类型选择了NetTie对PCB布线的影响2、问题场景进行PCB布线时,发现图1元件不同网络的焊盘可以连线,并且DRC检测不报错。图13、软硬件环境1)、软件版本:无关2)、电脑环境:Windows103)、外......
  • 界面控件DevExpress Blazor v24.2路线图预览——支持.NET 9、新增桑基图等
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。本文中包含了DevExpressBlazorv24.2官方发布的当前/预计的开发计划,请注意......
  • 在K8S中,什么是kubernetes?
    Kubernetes是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。Kubernetes(简称K8s)是一个功能强大的工具,它的设计初衷是提高在多个主机上运行的容器化应用的部署、伸缩、更新和维护过程的效率和简易性[1]。Kubernetes诞生于Google内部多年的容器管理技术积累,并......
  • 在K8S中,Kubernetes的组件有哪些?
    Kubernetes(K8s)是一个复杂的系统,由多个核心组件组成,这些组件协同工作来实现容器化应用的部署、扩展和管理。下面是Kubernetes的主要组件及其功能:1.控制平面组件控制平面负责管理集群的状态,包括调度、部署和维护集群中运行的容器化应用。控制平面组件通常运行在一个或多个控制节......