惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
U
Unit 42
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
GbyAI
GbyAI
P
Privacy International News Feed
T
Threatpost
Microsoft Azure Blog
Microsoft Azure Blog
NISL@THU
NISL@THU
T
Tenable Blog
P
Privacy & Cybersecurity Law Blog
L
Lohrmann on Cybersecurity
The Last Watchdog
The Last Watchdog
AWS News Blog
AWS News Blog
C
Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
D
Darknet – Hacking Tools, Hacker News & Cyber Security
G
GRAHAM CLULEY
Google DeepMind News
Google DeepMind News
H
Help Net Security
A
Arctic Wolf
Stack Overflow Blog
Stack Overflow Blog
S
Security Affairs
S
Securelist
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
L
LangChain Blog
博客园 - 【当耐特】
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
Blog — PlanetScale
Blog — PlanetScale
N
News | PayPal Newsroom
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research
S
Security @ Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog

博客园 - 神游虚空

解决 GDAL 用 C# 访问时,中文乱码问题。 学习AI编程 安装 RAGFlow 安装 KTransformer 量化投资赚的哪方面的钱? python中调用 .net 的 dll 时,报错:Exception has occurred: TypeLoadException 使用 Open XML SDK 实现 html 富文本转换为 docx 格式示例 在python中 先调用C#的dll 返回了一个类的列表,如何把这个列表转换为 python 中的 DataFrame? vue项目服务器部属源码调试解决办法 vue3 + ts + element_plus 创建后台管理系统,学习记录 大A指数周内效应分析 两个通达信公式 修道是精神上的减熵过程 BPMN2.0 Specifaction 节选翻译,10.4.6 事件处理(handling Events,原文 275页) BPMN2.0 Specifaction 节选翻译,10.4 事件 Events (原文233页) 使用ef或dbcontext的时候主要注意三个问题 EFCore 中 group 分组后,只选出每组中含有最大值的数据行 BPMN2.0 Specifaction 节选翻译,10.2.8 循环特征 Loop Characteristics (原文 189页) BPMN2.0 Specifaction 节选翻译,10.2.5 子流程 Sub-Processes (原文173页) BPMN2.0 Specifaction 节选翻译,10 Process (原文145页)
如何在.netcore 上实现 Rbac 权限管理
神游虚空 · 2021-09-24 · via 博客园 - 神游虚空

如何在.netcore 上实现 Rbac 权限管理

1、.netcore 的权限系统

     .netcore 的权限系统是将认证系统和授权系统分两步实现的

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
        ...
            
        // 认证系统
        app.UseAuthentication();
        // 授权系统
        app.UseAuthorization();

        ...
  }    

认证系统:解决用户是谁的问题。

当用户完成 Login 操作后,用户携带的相关信息通过 Claims 直接存到了 HttpContext.User.Identity 中。

授权系统:解决该用户有没有对应的权限问题。

2、.netcore 上的自定义授权实现

可以在 controller 上加 attribute 的方式,通过实现 IAsyncAuthorizationFilter 接口获得授权执行的入口。

   [Authorize]
    public class HomeController : Controller
    {
        ...
  
        [PermissionFilter]
        public IActionResult Privacy()
        {
            return View();
        }

        ...
    }
  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class PermissionFilter : Attribute, IAsyncAuthorizationFilter
    {
        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            var url = context.HttpContext.Request.Path;
            var authorizationService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
            var authorizationResult = await authorizationService.AuthorizeAsync(context.HttpContext.User, null, new PermissionAuthorizationRequirement(url));
            if (!authorizationResult.Succeeded)
            {
                context.Result = new ForbidResult();
            }
        }
    }

其中 authorizationService 是自定义的授权类,需要在 Startup 文件中的 ConfigureServices 函数中提前注册好,而 PermissionAuthorizationRequirement() 是授权类需要用到的参数类

     public void ConfigureServices(IServiceCollection services)
        {
            ...

            services.AddSingleton<IAuthorizationHandler, PermissionAuthorizationHandler>();
        }

下面的代码是 PermissionAuthorizationHandler 的具体实现:

    public class PermissionAuthorizationRequirement : IAuthorizationRequirement
    {
        public PermissionAuthorizationRequirement(string path)
        {
            Path = path;
        }

        public string Path { get; set; }
    }

    public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionAuthorizationRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionAuthorizationRequirement requirement)
        {
            if (context.User != null)
            {
                if (context.User.IsInRole("admin"))
                {
                    context.Succeed(requirement);
                }
                else
                {
                    var userIdClaim = context.User.FindFirst(_ => _.Type == ClaimTypes.NameIdentifier);
                    if (userIdClaim != null)
                    {
                        //if (_userStore.CheckPermission(int.Parse(userIdClaim.Value), requirement.Path))
                        {
                            context.Succeed(requirement);
                        }
                    }
                }
            }
            return Task.CompletedTask;
        }
    }

通过在 HandleRequirementAsync 函数中,返回

context.Succeed(requirement)

表示授权通过。

3、Rbac 授权实现

通过 1和2 ,我们找到了实现自定义授权的方式,下面看看 Rbac 授权如何实现。

 Rbac 是通过把 permission 列表配给 role ,然后把多个 role 分配给用户。

对于 controller 上的函数 Path ,正好就是这里的 permission,所以授权就是检测用户是否有 Path 的授权。

CheckPermission(int.Parse(userIdClaim.Value), requirement.Path)

4、参考资料

OAuth2.0究竟是个啥?

OAuth 2.0 系列教程

 ASP.NET Core 认证与授权[5]:初识授权

在ASP.NET Identity 2.0中使用声明(Claims)实现用户组

 扩展IdentityRole和IdentityUser(Extending IdentityRole and IdentityUser)

如何创建UserManager的实例(How do i create an instance of UserManager)

扩展ASP.NET Identity使用Int做主键