.net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims
导读
1. 如何添加自定义的claims.
前请提要
目前我们拥有了三个web应用.
- localhost:40010, 验证服务器
- localhost:40011, mvc客户端, 充当webapp请求者
- localhost:40012, webapi, 资源, 受到验证服务器的保护
在http://localhost:40011/Home/secure登录之后, 我们看到了很多的claims, 其中有name, ( 来自aspnetUsers表的userName字段)
那么, 如果我想在accesstoken中增加其他的字段呢, 比如, 用户头像url, 性别等等
那么下面我们开始工作
打开验证服务器(这次只需要修改验证服务器)的Model/ApplicationUser文件, 添加两个字段
然后去对应的数据表增加两个字段.
新增一个ProfileService继承自IdentityServer4.Services.IProfileService
public class CustomProfileService : IProfileService
{
private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
private readonly UserManager<ApplicationUser> _userManager; public CustomProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory)
{
_userManager = userManager;
_claimsFactory = claimsFactory;
} public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
//获得登录用户的ID
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
//创建一个以当前用户为主体的凭证
var principal = await _claimsFactory.CreateAsync(user); var claims = principal.Claims.ToList();
//idsv服务器的默认claim
claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList(); //自定义claims区间
claims.Add(new Claim(JwtClaimTypes.GivenName, user.UserName));
claims.Add(new Claim("headimgurl", user.HeadImgUrl));
claims.Add(new Claim("gender", user.Gender)); //设置claims
context.IssuedClaims = claims; } public async Task IsActiveAsync(IsActiveContext context)
{
var sub = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
}然后在Startup的注册idsv的地方添加自定义的ProfileService的注入即可
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(AuthorizationConfig.GetIdentityResources())
.AddInMemoryApiResources(AuthorizationConfig.ApiResources())
.AddInMemoryClients(AuthorizationConfig.Clients())
.AddAspNetIdentity<ApplicationUser>()
.AddProfileService<CustomProfileService>();
运行起所有的服务


左图是mvc客户端读取的自定义claims, 右侧是在mvc客户端去请求受保护的webapi后, webapi拿到的信息
注意
通过ProfileService的使用, 可以不受管制地向客户端发送claims.
这是什么意思如何理解呢?
在我们的idsv的配置类中, 有IdentityResources, 有Clients, 有apiResources, 这些配置限制了客户端能请求到的服务器资源.
在客户端程序中的startup中, 我们能看到一句代码
这就是客户端添加能访问的资源的地方. 我们将在以后的consent授权页面去细说这方面的知识
那么, 通过profileservice颁发的claims, 任意clients都能拿到
.net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims的更多相关文章
- .net core Identity集成IdentityServer(3) 一键登出
在客户端程序, 我们补充一键登出操作. 使用了idsv之后, 退出的操作需要删除本地cookie, 然后去请求认证服务器, 也删除认证服务器的cookie. 官网给的退出的代码 public asyn ...
- .net core Identity集成IdentityServer4 (1)基本操作
一. 新建asp.net core identity项目 新建项目->asp.net core web应用程序-> web应用程序(模型视图控制器)&更改身份验证为个人. 新建一个 ...
- .net core identity集成微信授权登录
最快的方式是直接nuget安装AspNetCore.Authentication.WeChat包. 想要知道是如何实现的,可以看下面github上面的源码. 源码在这里:https://github. ...
- IdentityServer(12)- 使用 ASP.NET Core Identity
IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...
- IdentityServer4【QuickStart】之使用asp.net core Identity
使用asp.net core Identity IdentityServer灵活的设计中有一部分是可以将你的用户和他们的数据保存到数据库中的.如果你以一个新的用户数据库开始,那么,asp.net co ...
- ASP.NET Identity实现分布式Session,Docker+Nginx+Redis+ASP.NET CORE Identity
零.背景介绍 在学习ASP.NET CORE开发的过程中,身份认证是必须考虑的一项必要的组件.ASP.NET CORE Identity是由微软官方开发的一整套身份认证组件,兼具完整性和自由度.Doc ...
- 从零搭建一个IdentityServer——集成Asp.net core Identity
前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...
- 第16章 使用ASP.NET Core Identity - Identity Server 4 中文文档(v1.0.0)
注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么A ...
- Ocelot简易教程(五)之集成IdentityServer认证以及授权
Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...
随机推荐
- JDK源码核心包
一.核心包有哪些? Jdk的包中,除开了lang包下面的类,用得最多的应该要属于util包下面的类了, 本篇文章主要针对Jdk的util包下面的类(util目录下面的类,暂时不包括util 包下面的子 ...
- MySQL 三 通过yum源安装指定版本的mariadb
1.yum源安装指定的版本 1)准备工作 下载安装当前次新版 https://downloads.mariadb.org/ 选择rpm包,点击Repository Config ...
- AdminLTE用django部署
前言 最近从网上看到AdminLTE这个web前端的主题挺好的,我平时用python就是写一些后台,准备以后就用这个框架了,这里就是把这个用django初始化一下这个项目. 基础环境介绍 Python ...
- Vuejs——(8)Vuejs组件的定义
版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...
- linux命令_文件目录操作命令
# linux命令--文件和目录操作命令 pwd "print working directory" 打印工作目录的绝对路径 范例: 在bash命令行显示当前用户的完整路径 系统B ...
- nova scheduler filters 配置
scheduler_driver = nova.scheduler.filter_scheduler.FilterScheduler scheduler_default_filters = Avail ...
- boost::bind 实现原理, 手动实现一个
template<typename R, typename T, typename A1> class hangj_call { public: hangj_call(R (T::*f_) ...
- 《机器学习实战(基于scikit-learn和TensorFlow)》中英文资源+源码 下载
https://pan.baidu.com/s/1iTIoa4RXdK-lo_QEgLEOFw 提取码:76hf
- OpenCL科普及在ubuntu 16.04 LTS上的安装
OpenCL(Open Computing Language,开放计算语言)是一个为异构平台编写程序的框架,此异构平台可由CPU.GPU.DSP.FPGA或其他类型的处理器與硬體加速器所组成.Open ...
- 12-部署EFK插件
配置和安装 EFK 官方文件目录:cluster/addons/fluentd-elasticsearch $ ls *.yaml es-controller.yaml es-service.yaml ...
然后去对应的数据表增加两个字段.