本文將介紹在 Identity 框架中如何使用?Sang.AspNetCore.RoleBasedAuthorization[1]?庫。
核心介紹
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
?運行項目。
訪問/User/init
創建初始用戶和角色。admin,user,supadmin,其密碼均為123456。
然后通過/User/check
檢查用戶密碼,獲取access_token
,然后更換不同的用戶來測試 Values 這個 Controller 的資源訪問。
最后
本文相關倉庫感興趣的同學可以查閱:https://github.com/sangyuxiaowu/IdentityRBAC
如有錯漏之處,敬請指正。
References
[1]
?Sang.AspNetCore.RoleBasedAuthorization:?https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization