.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简易教程(三)之主要特性及路由详解 ...
随机推荐
- Linux环境下java开发环境搭建二 tomcat搭建
第一步:下载安装包并解压 # tar zxvf 压缩包名 第二步:把解压出的文件移动到/usr/local/tomcat7中 #mv 解压出来的文件夹 /usr/local/tomcat7 第三步: ...
- Struts2学习第四天——全局结果,动态结果及异常映射
1.异常映射的配置 当Action方法出错时Struts会返回异常错误信息页面,这种页面方式是不友好的,可以使用try-catch捕捉异常,然后在catch块中返回对应的错误页面.这种为单个<a ...
- Redis Sentinel 模拟故障迁移
什么是redis sentinel 参考文档:https://redis.io/topics/sentinel 简单的来说,就是Redis Sentinel 为redis 提供高可用性,主要体现在下面 ...
- Beta冲刺 (6/7)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1:(组长)柯奇豪 过去两天完成了哪些任务 部分代码的整合 编辑及标注的提交操 ...
- Solutions and Summay for Linked List Naive and Easy Questions
1.Remove Linked List Elements package linkedlist; /* * Question: Remove all elements from a linked l ...
- 解决“UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24051: illegal multibyte sequence”错误
今天我在爬取一个网页时出现了下面这个错误: UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 240 ...
- Django(序列化、SweetAlert插件)
day72 参考:https://www.cnblogs.com/liwenzhou/p/8718861.html#autoid-6-1-2 前端序列化 后端序列化 day73中 补充一个SweetA ...
- JS应用实例3:定时弹出广告
在观看视频时候总会发现有广告弹出 这里就做一个类似这样的定时弹出广告的实例: 前面的JS代码和HTML写在同一个文件,实际开发中总是分开来写 用的时候引入即可 HTML代码: <!DOCTYPE ...
- [CocoaPods]pod安装与pod更新
简介 许多以CocoaPods开头的人似乎认为pod install只在第一次使用CocoaPods设置项目时使用,pod update之后才会使用.但事实并非如此. 本指南的目的是解释何时使用pod ...
- HTTP请求时间参数设置
1. JSON 2019-01-18 18:36:35 2. Postman 2019/01/18 18:36:35