首页 > 其他分享 >.net 6 Policy-based authorization 基于策略授权

.net 6 Policy-based authorization 基于策略授权

时间:2023-06-19 17:12:45浏览次数:31  
标签:based AspNetCore Role User context Policy net null logger

授权策略包含一个或多个要求。 在应用的 文件中将其注册为授权服务配置的一 Program.cs 部分:

builder.Services.AddSingleton<IAuthorizationHandler, User_Role_Url_AHandler1>();
builder.Services.AddAuthorization(options => { options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("管理组")); options.AddPolicy("User_Role_Url", policy => policy.Requirements.Add(new User_Role_Url_Requirement()) });
policyBuilder 是个形式参数,什么名字都可以。
涉及到的几个类:
User_Role_Url_Requirement继承自IAuthorizationRequirement,表示一个策略授权请求。通常包含名称和其他基本数据,结构比较简单。关键的是处理程序的定义,下面的程序演示授权请求(AuthorizationRequirement)与处理程序(AuthorizationHandler)是一对一关系。还有一对多、多对一关系。
public class User_Role_Url_AHandler1 : AuthorizationHandler<User_Role_Url_Requirement>
  {
    private readonly ILogger<LoginModel> _logger;
    //private readonly lctcenter2019Context _lctcenter2019Context;
    private readonly IConfiguration _configuration;
    public User_Role_Url_AHandler1(ILogger<LoginModel> logger, IConfiguration config)
    {
      _logger = logger;
      _configuration = config;
      //_lctcenter2019Context = pl;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, User_Role_Url_Requirement requirement)
    {
      //_logger.LogInformation("HandleRequirementAsync");
      Endpoint? endPoint = null;
      if (context != null && context.Resource != null)
      {
        DefaultHttpContext? dhc = context.Resource as DefaultHttpContext;
        if (dhc != null)
        {
          endPoint = dhc.GetEndpoint();         //Microsoft.AspNetCore.Http.Endpoint {Microsoft.AspNetCore.Routing.RouteEndpoint 大括号中是真实类型}

          if (endPoint != null)
          {
            //{/PolicyTest}   Microsoft.AspNetCore.Http.Endpoint {Microsoft.AspNetCore.Routing.RouteEndpoint}
            //_logger.LogInformation(string.Format(">>>>{0}<<<<", endPoint.DisplayName));
            var controllerActionDescriptor = endPoint!.Metadata
              .ToList().FirstOrDefault(d => d is ControllerActionDescriptor) as ControllerActionDescriptor;
            string controllerName, actionName;
            if (controllerActionDescriptor != null)
            {
              controllerName = controllerActionDescriptor.ControllerName;
              actionName = controllerActionDescriptor.ActionName;
            }
          }
        }
      }

      //&& context.User.IsInRole("Examine")
      if (context != null)
      {
        if (context.User.Identity == null || !context.User.Identity.IsAuthenticated)
        {
          context.Fail();
        }
        else
        {
          var roles_list = context.User.FindAll(ClaimTypes.Role);
          if (roles_list == null || !roles_list.Any())
          {
            //还没有角色
          }
          else
          {
            using (var connection = new SqlConnection(_configuration.GetConnectionString("sql_server_172")))
            {
              Microsoft.AspNetCore.Routing.RouteEndpoint rEdnp = endPoint as Microsoft.AspNetCore.Routing.RouteEndpoint;
              if (rEdnp == null)
              {
                context.Fail();
              }

              var r = connection.Query
                 ("select user_name,user_id,uid,role_id,role_name,url_xid,url,urltitle FROM vw_UserFunction WHERE (uid=@uid and url=@url)",
                 new { uid = context.User.Identity.Name, url = rEdnp.RoutePattern.RawText });
              if (rEdnp.RoutePattern.RawText == "MainTab" || r.Any())
              //if (endPoint != null && 0 == string.Compare(endPoint.DisplayName, "/Account/UserRole_boot5", true))
              {
                context.Succeed(requirement);
                //if (context.User.IsInRole("管理组"))                   //(roles_list.Any(z => z.Value == "管理组"))
                //{
                //  context.Succeed(requirement);
                //}
                //else
                //{
                //  context.Fail();
                //}
              }
              else
              {
                _logger.LogInformation(string.Format("HandleRequirementAsync【vw_UserFunction验证】>>>>{0},{1}<<<<", context.User.Identity.Name, rEdnp.RoutePattern.RawText));
                context.Fail();
              }
            }
            //foreach (var v in roles_list)
            //{
            //  _logger.LogInformation(v.Value);
            //}
          }
        }

      }
      return Task.CompletedTask;
      //return Task.FromResult(0);
    }
  }
核心过程HandleRequirementAsync中:
验证成功 context.Succeed(requirement);
验证失败 context.Fail();
最后:return Task.CompletedTask;


 

标签:based,AspNetCore,Role,User,context,Policy,net,null,logger
From: https://www.cnblogs.com/edong/p/17482858.html

相关文章

  • (转)kubernetes(k8s) yaml 文件详解2
    原文:https://juejin.cn/post/7202145223014252602#heading-0一、K8S支持的文件格式kubernetes支持YAML和JSON文件格式管理资源对象。JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读1、yaml和json的主要区......
  • kubernetes入门
    一、kubernetes简介kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了......
  • .Net 微服务之旅 -- 系列文章
    合集-微服务.Net微服务之旅Windows10开启子系统Ubuntu子系统安装Docker 出处:https://www.cnblogs.com/kingkangstudy/collections/3069......
  • 一次与 ChatGPT 的 .NET 面试问答
    以常用问题来面试机器人,机器人是否能够合格1.您能描述一下您曾经在.NET项目中集成硬件设备的经历吗?这个过程是怎样的,您面临了哪些挑战?GPT回答:当我在.NET项目中集成硬件设备时,我首先研究了硬件设备的文档,了解了其API和接口。我编写了一个简单的应用程序来测试硬件设备的基本功......
  • .Net 微服务之旅
    本系列文章从0开始搭建微服务,基于自己本地环境开发。本系列会一步步记录整个开发实战环境。不足之处,望各位多多指正,会不定期修改并更正到文章中。基础资源Windows10VisualStudio2022.Net7.0WSL2子系统UbuntuDockerGitLab&GitLabCI/CDNuget私有仓库......
  • 关于ASP.NET.CORE中的Failed to read parameter "string param" from the request bod
    先上报错信息Microsoft.AspNetCore.Http.BadHttpRequestException:Failedtoreadparameter"stringparam"fromtherequestbodyasJSON.--->System.Text.Json.JsonException:'s'isaninvalidstartofavalue.Path:$|LineNumber:0|By......
  • .net 数据库开发的时候的一些错误
    (.netC#)今天找到了一个错误,就是在数据库记录用程序插入的时候,竟然没有检查数据库的列和插入列有没有匹配,找出错误。 ......
  • 记一次 .NET 某旅行社审批系统 崩溃分析
    一:背景1.讲故事前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的crashdump就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接:[.NET程序崩溃了怎么抓Dump?我总结了三种方案]https://www.cnblogs.com/huangxincheng/p/148119......
  • ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
    认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作——登录和注销。ASP.NETCore利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用于登录、注销以及“质询”的API,本篇文章利用它们使用最简单的代码实现这些功能。(本文提供的示例演示已经同......
  • .NET Core Web API 实现图形验证码
    https://blog.csdn.net/liwan09/article/details/126319320?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-126319320-blog-101289369.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_......