.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 ...
随机推荐
- E - Help Jimmy POJ - 1661 dp
E - Help Jimmy POJ - 1661 这个题目本身不是很难,但是可以更加优化这个写法. 开始是n*n #include <cstdio> #include <cstri ...
- 线段树 逆序对 Minimum Inversion Number HDU - 1394 Laptop
Minimum Inversion Number HDU - 1394 求最小反转数,就是求最少的逆序对. 逆序对怎么求,就是先把所有的数都初始化为0,然后按照顺序放入数字,放入数字前查询从这个数往后 ...
- jQuery中val() text()和html()的区别
2020年4月21日 16:48:11 jQuery 学习 html() 它可以设置和获取起始标签和结束标签中的内容. 跟 dom 属性 innerHTML 一样.text() 它可以设置和获取起始标 ...
- STM32 TIM 编码器模式采集编码器信号
layout: post tags: [STM32] comments: true 文章目录 @[toc] 什么是正交解码? 编码器接口模式 标准库接口 TIM_TimeBaseInitTypeDef ...
- 设计模式之GOF23外观模式
外观模式 迪米特原则:一个软件实体应当尽可能少的与其他实体发生相互作用 外观模式核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用 相当于找了个代理帮你做了所有事而你只需要和代理打交道
- python 基础知识1
一.编译型与解释性区别: 编译型:一次性将全部的代码编译成二进制文件.(如:C.C++) 优点:运行效率高 缺点:开发速度慢,不能跨平台. 解释型:当程序运行时,从上至下一行一行的解释成二进制.(如p ...
- 分布式锁-Redission-Lock锁的使用与原理
环境准备 添加 Maven 依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>re ...
- javaWeb手动分页步骤
一:编写实体类@Setter@Getter@ToString@Entity@Repositorypublic class PageBean<T> { private Integer cur ...
- 2018-06-24 js BOM对象
BOM对象: Browser Object Model 即浏览器对象模型: 包含: window:窗口对象 alert();//警示框 confirm();//确认框 prompt();//输入提示框 ...
- 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解
关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...