在Identity框架中使用RoleBasedAuthorization

简介: 本文将介绍在 Identity 框架中如何使用 [Sang.AspNetCore.RoleBasedAuthorization](https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization) 库。

核心介绍

Identity 和 jwt 的基本配置我们在这里不再赘述,可以参考最后的项目样例。核心的代码主要为 IRolePermission 的实现。

internal class MyRolePermission : IRolePermission
{

    private readonly IMemoryCache _memoryCache;

    private readonly RoleManager<MyRole> _roleManager;

    private readonly string cachekey = "Role_Permission_";

    public MyRolePermission(IMemoryCache memoryCache, IServiceProvider _sp)
    {
        _memoryCache = memoryCache;
        _roleManager = _sp.CreateScope().ServiceProvider.GetRequiredService<RoleManager<MyRole>>();
    }

    public async Task<List<Claim>> GetRolePermissionClaimsByName(string roleName)
    {
        var claims = await _memoryCache.GetOrCreateAsync(cachekey + roleName, async (e) =>
        {
            e.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3600);
            e.SlidingExpiration = TimeSpan.FromMinutes(10);//10分钟滑动过期
            var myrole = await _roleManager.FindByNameAsync(roleName);
            if (myrole is null) return new List<Claim>();
            var list = await _roleManager.GetClaimsAsync(myrole);
            return list;
        });
        return claims.ToList();
    }
}

这里需要注意的是 IRolePermission 是 Singleton 单例模式,服务在第一次请求时被创建,其后的每次请求都沿用这个已创建的服务。而 RoleManager 是 Scoped 作用域模式,服务在每次请求时被创建,整个请求过程中都贯穿使用这个创建的服务。所以在 MyRolePermission 中因为其生命周期不同,无法直接注入使用。

使用展示

完整的代码可以查看仓库 https://github.com/sangyuxiaowu/IdentityRBAC

克隆仓库后修改 Program.cs L45 的数据库相关配置,然后迁移 Update-Database 运行项目。

API

访问/User/init创建初始用户和角色。admin,user,supadmin,其密码均为123456。

初始化

然后通过/User/check检查用户密码,获取access_token,然后更换不同的用户来测试 Values 这个 Controller 的资源访问。

最后

本文相关仓库感兴趣的同学可以查阅:
https://github.com/sangyuxiaowu/IdentityRBAC

如有错漏之处,敬请指正。

相关文章
|
API 数据处理 数据安全/隐私保护
curl基础用法
curl基础用法
|
传感器 物联网 5G
物联网(AIOT)--下一个技术风口
我们现在身边越来越多的硬件设备正在被嵌入芯片、软件,从而实现更多的功能和更紧密的联系。 物联网其实是借助互联网的力量,实现万物互联。
1423 3
|
SQL API 索引
Superset对接ElasticSearch服务展示
Superset对接ElasticSearch服务展示
1171 2
webpack 打包去掉控制台的console.log()
webpack 打包去掉控制台的console.log()
1209 0
webpack 打包去掉控制台的console.log()
|
4月前
|
人工智能 弹性计算 API
2026阿里云人工智能PAI免费试用:PAI-EAS模型在线服务A10/V100等500元1个月
阿里云PAI推出模型在线服务PAI-EAS,支持Qwen3、Llama等主流模型一键部署为高可用API,弹性伸缩、GPU加速,新用户享500元代金券,免费试用A10/V100等GPU实例,助力低成本高效推理。
|
监控 数据可视化 定位技术
2024年最强看板工具大对比:哪款最适合公司团建旅游活动策划?
本文介绍了5款看板工具(板栗看板、Trello、Asana、Monday.com、ClickUp)及其在公司团建旅游策划中的应用,通过具体案例展示了如何利用这些工具高效管理活动的各个环节,包括目的地规划、任务分配、预算管理、日程安排、团队沟通与反馈等,旨在提升团队协作效率和活动策划质量。
2024年最强看板工具大对比:哪款最适合公司团建旅游活动策划?
|
Rust 开发工具 开发者
Ruff代码分析
Ruff代码分析
596 0
|
安全 数据挖掘 API
快手小店详情API接口的获取与应用
在数字化时代,电商平台竞争激烈,API接口作为连接不同系统和服务的桥梁,已成为电商生态中不可或缺的一部分。本文详细介绍快手小店详情API接口的获取与应用,帮助开发者和企业提升业务效率和用户体验。涵盖API接口定义、主要应用场景、注册与认证流程、调用方法及实际应用案例,提供最佳实践建议。
725 1
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
535 1
|
存储 安全 算法
【C++ 包装器类 std::atomic 】全面入门指南:深入理解并掌握C++ std::atomic 原子操作 的实用技巧与应用
【C++ 包装器类 std::atomic 】全面入门指南:深入理解并掌握C++ std::atomic 原子操作 的实用技巧与应用
1940 1