在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

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

相关文章
|
4月前
|
存储 开发框架 JSON
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
|
4月前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
XML Java 数据格式
web.xml 文件报错:cvc-id.3: A field of identity constraint ‘.....
报错内容 在对Dynamic Web Project的web.xml进行配置时,遇到如下错误,大概的翻译如下:“身份约束“ web-common-servlet-name-uniqueness”字段与元素“ web-app”匹配,但该元素没有简单的类型。”
232 0
web.xml 文件报错:cvc-id.3: A field of identity constraint ‘.....
|
Java 数据库
JPA通用策略生成器(@GeneratedValue 四种标准用法为TABLE, SEQUENCE, IDENTITY, AUTO)
JPA通用策略生成器(@GeneratedValue 四种标准用法为TABLE, SEQUENCE, IDENTITY, AUTO)
203 0
|
前端开发 .NET 中间件
Identity Server 4 - Hybrid Flow - MVC客户端身份验证
预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: https://www.
2189 0
|
JSON 前端开发 .NET
Identity Server 4 - Hybrid Flow - Claims
前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html Claims 我不知道怎么样翻译这个词比较好, 所以我一般就不翻译了.
1798 0
|
Web App开发 安全 API
Identity Server 4 预备知识 -- OAuth 2.0 简介
OAuth 2.0 简介 OAuth有一些定义: OAuth 2.0是一个委托协议, 它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源, 注意是代表这些人, 而不是假冒或模仿这些人. 这个应用从资源的所有者那里获得到授权(Authorization)和access token, 随后就可以使用这个access token来访问资源. (这里提到的假冒或模仿就是指在客户端复制一份用户名和密码,从而获取相应的权限)。
1715 0