.net core 基于AspNetCore.Identity+Identityserver4用户的权限管理
一般权限控制,是先给角色分配对应权限,然后再给用户分配角色;总权限应该是在代码编写的时候就已经固定了,例如有个用户更新的接口,这里就会诞生一个用户更新的权限,接口在权限就在,没有接口也就没有了这个权限;
所以总权限我是维护在代码中静态常量,在AuthorizeAttribute中设置权限也是要常量;
使用原生AuthorizeAttribute的Policy和用户的Claim(有userClaim和roleClaim),userClaim和roleClaim是AspNetCore.Identity的表,保存用户的声明信息和角色声明信息,也就是可以在roleClaim中保存角色的权限;
用户登录后获取token,token经过ProfileService处理,带有用户的权限Claim,用户请求需要权限的接口时,会检查token中有没有这个权限要求的Claim;
分为两个服务,一个Identityserver4服务,一个UserAPI服务;
Identityserver4服务
ConfigureServices
string mysqlConnectionStrings = $"Data Source={Host};port={Port};Initial Catalog={Database};user id={UserID};password={Password};";
services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql(mysqlConnectionStrings));
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
var builder = services.AddIdentityServer()
.AddInMemoryIdentityResources(Config.Ids)
.AddInMemoryApiResources(Config.Apis)
.AddInMemoryClients(Config.Clients(Configuration))
.AddAspNetIdentity<ApplicationUser>()
//.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
.AddProfileService<ProfileService>();
// not recommended for production - you need to store your key material somewhere secure
builder.AddDeveloperSigningCredential();
需要注意ProfileService,这里返回token中Claim,去数据库获取用户的Claim
/// <summary>
/// This method is called whenever claims about the user are requested (e.g. during token creation or via the userinfo endpoint)
///
/// </summary>
/// <param name="context">The context.</param>
/// <returns></returns>
public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var sub = context.Subject?.GetSubjectId();
//context.Subject.Claims 为登录设置的Claims,此处直接用数据库中的claims,忽略context.Subject.Claims
if (sub == null) throw new Exception("No sub claim present"); var user = await _userServer.FindByIdAsync(sub);
if (user == null)
{
Logger?.LogWarning("No user found matching subject Id: {0}", sub);
}
else
{
//获取用户的权限
var userPermissions = await _rolePermissionServer.GetUserPermissions(user.Id); List<Claim> claims = new List<Claim>(); claims = userPermissions.Select(a => new Claim("UserPermission", a.NormalizedName)).ToList();
claims.Add(new Claim("username", user.UserName));
claims.Add(new Claim("name", user.Name));
context.IssuedClaims = claims;
}
}
UserAPI服务
UserApi服务除了正常的配置Identityserver4服务以外,还需要添加认证需要的Policy,因为权限都需要认证,所以我把所有的权限都加进去;
//获取所有的权限列表
var permissionsList = PermissionNames.GetPermissionsList(); //设置Authorize的policy,可以添加多个
services.AddAuthorization(options =>
{
foreach (var item in permissionsList)
{
options.AddPolicy(item.NormalizedName, policyAdmin =>
{
policyAdmin.RequireClaim("UserPermission", item.NormalizedName);
});
} });
下面两个中间件也不能忘记
app.UseAuthentication();
app.UseAuthorization();
接下来是Controller部分
[HttpGet]
[Route("manage")]
[Authorize(PermissionNames.UserManage_list)]
public async Task<PageBase<UserListItemDto>> UserManageList([FromQuery]UserListRequestDto request)
{
return await _userServer.UserManageList(request);
}
[HttpGet]
[Route("manage/{id}")]
[Authorize(PermissionNames.UserManage_detail)]
public async Task<UserDetailDto> UserManageDetail(int id)
{
return await _userServer.UserManageDetail(id);
}
[HttpPut]
[Route("manage")]
[Authorize(PermissionNames.UserManage_update)]
public async Task<bool> UserManageUpdate(UserEditDto userEditDto)
{
return await _userServer.UserManageUpdate(UserId, userEditDto);
}
[HttpDelete]
[Route("manage/{id}")]
[Authorize(PermissionNames.UserManage_delete)]
public async Task<bool> UserManageDelete(int id)
{
return await _userServer.UserManageDelete(UserId, id);
}
具体代码,还有更多内容学习:https://github.com/zhanghm1/DiuDiuTemplate
.net core 基于AspNetCore.Identity+Identityserver4用户的权限管理的更多相关文章
- 理解OpenShift(4):用户及权限管理
理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...
- 基于Spring Security2与 Ext 的权限管理设计与兑现
基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...
- 【linux相识相知】用户及权限管理
linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...
- MySQL基础篇(07):用户和权限管理,日志体系简介
本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL用户 1.基础描述 在数据库的使用过程中,用户作为访问数据库的鉴权因素,起到非常重要的作用,安装MySQL时会自动生成一个roo ...
- linux的用户扩充权限管理acl和用户使用系统资源的限制
用户扩充权限管理 acl 1.扩充权限的方式 文件扩充权限 ACL 磁盘配额 2.文件扩充权限 1.安全位 安全位 ---set位 SUID SGID set仅可以加给 u.g, 如: ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10
今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...
- MySQL用户与权限管理
执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...
- mysql用户和权限管理
用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...
随机推荐
- JavaScript 浅析数组对象与类数组对象
数组(Array对象) 数组的操作 创建数组方法 添加与修改数组元素 删除数组元素 使用数组元素 遍历数组元素 多维数组 数组相关的函数 concat() join() pop() push() sh ...
- Autohotkey心得
玩游戏,烧钱和作弊是永恒的话题,热键一定程度上和作弊相关.办公用数据库.编程.商业智能,一定程度上也是作弊,欺负没有相关信息技术的公司.个人. 避免和输入法产生冲突,少用Send,多用剪切板中转. E ...
- JDBC04 PreparedStatement
PreparedStatement类 存在预编译,用占位符去填参数(参数索引从1开始算),可以防止SQL注入 try { Class.forName("com.mysql.cj.jdbc.D ...
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...
- 使用npoi导入Excel - 带合并单元格--附代码
之前我们在使用npoi导入excel表格的时候,往往会遇见那种带有合并单元格的数据在导入的时候出现合并为空的问题, 也就是只有第一条有数据,其余均为空白.在网上翻了半天也没有找到合适的解决方案,最后还 ...
- flink批处理从0到1学习
一.DataSet API之Data Sources(消费者之数据源) 介绍: flink提供了大量的已经实现好的source方法,你也可以自定义source 通过实现sourceFunction接口 ...
- 一道题带你搞定Python函数中形参和实参问题
昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂.人生苦短,我用Python. 为了解答大家 ...
- chrome安装工具
0x00 简介 今天在知识星球的小迪渗透吧对外交流群里看到Web安全从业者必备Chrome插件这篇帖子,看完之后,我虽然还是个学生,但我也是个垃圾啊.我的chrome上面没有一个上面描述的工具,真的是 ...
- mybatis开发,你用 xml 还是注解?我 pick ...
最近在看公司项目时发现有的项目mybatis是基于注解开发的,而我个人的习惯是基于xml文件开发. 对于mybatis注解开发的原理理解不够,于是翻阅了部分源码,写下此文.主要介绍了mybatis开发 ...
- javascript----放大模式
放大模式 1.介绍:放大模式降低模块之间直接的联系,降低耦合,当一个模块出现错误,不会影响另一个模块的功能