IdentityServer4授权和认证集成Identity和profile
identiyt的使用可以看之前的文章:https://www.cnblogs.com/nsky/p/10323415.html
之前的ids4授权服务器都是用的in-men方式把数据添加到内存,
现在应该改成identity对接数据库操作,因为之前的代码有,就不一一创建了
nuget包:IdentityServer4.AspNetIdentity
那么之前的TestUser以及TestUserStore都要替换掉
AddAspNetIdentity<ApplicationUser>()
那么Profile是什么? Profile就是用户资料,ids 4里面定义了一个IProfileService的接口用来获取用户的一些信息,
主要是为当前的认证上下文绑定claims。我们可以实现IProfileService从外部创建claim扩展到ids4里面。
定义一个ProfileServices类继承IProfileService
using AuthorizationServer.Models;
using IdentityModel;
using IdentityServer4.Models;
using IdentityServer4.Services;
using Microsoft.AspNetCore.Identity;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks; namespace AuthorizationServer.Services
{
/// <summary>
/// Profile就是用户资料,ids 4里面定义了一个IProfileService的接口用来获取用户的一些信息
/// ,主要是为当前的认证上下文绑定claims。我们可以实现IProfileService从外部创建claim扩展到ids4里面。
/// 然后返回
/// </summary>
public class ProfileServices : IProfileService
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly RoleManager<ApplicationRole> _roleManager;
public ProfileServices(
UserManager<ApplicationUser> userManager,
RoleManager<ApplicationRole> roleManager)
{
_userManager = userManager;
_roleManager = roleManager;
} public async Task<List<Claim>> GetClaimsFromUserAsync(ApplicationUser user)
{
var claims = new List<Claim> {
new Claim(JwtClaimTypes.Subject,user.Id.ToString()),
new Claim(JwtClaimTypes.PreferredUserName,user.UserName)
}; var role = await _userManager.GetRolesAsync(user);
role.ToList().ForEach(f =>
{
claims.Add(new Claim(JwtClaimTypes.Role, f));
}); if(!string.IsNullOrEmpty(user.Avatar))
{
claims.Add(new Claim("avatar", user.Avatar));
}
claims.Add(new Claim("姓名", "tom"));
return claims;
} /// <summary>
/// 获取用户Claims
/// 用户请求userinfo endpoint时会触发该方法
/// http://localhost:5003/connect/userinfo
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value;
var user = await _userManager.FindByIdAsync(subjectId);
context.IssuedClaims =await GetClaimsFromUserAsync(user);
} /// <summary>
/// 判断用户是否可用
/// Identity Server会确定用户是否有效
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task IsActiveAsync(IsActiveContext context)
{
var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value;
var user = await _userManager.FindByIdAsync(subjectId);
context.IsActive = user != null; //该用户是否已经激活,可用,否则不能接受token /*
这样还应该判断用户是否已经锁定,那么应该IsActive=false
*/
}
}
}
ConfigureServices也要修改:

这样的话。配置基本上就完成了
接下来用Hybrid Flow实现试试
因为CodeIdToken 有2种方式返回profile
ResponseType改成 code id_token
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
//设置从UserInfoEndpoint获取claims信息
options.GetClaimsFromUserInfoEndpoint = true;
获取后映射到claims
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapJsonKey("sub", "sub");
options.ClaimActions.MapJsonKey("preferred_username", "preferred_username");
options.ClaimActions.MapJsonKey("avatar", "avatar");
options.ClaimActions.MapCustomJson("role", job => job["role"].ToString());
这样会返回的access_token信息也包含了该信息,
但如果claims过大,那么access_token也会很大
授权成功了。在view页面
引入:@using Microsoft.AspNetCore.Authentication
并获取

这样就会有ProfileServices.cs类中获取的clsims了

access_token中同样会有

id_token中是不会有的
上面说了,profile的cliams信息是通过access_token访问UserInfoEndpoint获取的
我们也可以通过postman试试

而这些信息都是从数据库读取出来的

如果不设置GetClaimsFromUserInfoEndpoint=true
它默认是false
那么我们想得到怎么办,
1:可以自己用access_token去获取一次
2:授权服务器client设置 AlwaysIncludeUserClaimsInIdToken=true
这样就会把返回的profile信息包含在idtoken中,好像idtoken也会有很大的可能
好了。试试效果,这样其实idtoken和access_token都返回了profile信息
IdentityServer4授权和认证集成Identity和profile的更多相关文章
- IdentityServer4授权和认证
IdentityServer4 简称ids4 oidc了解:http://www.jessetalk.cn/2018/04/04/oidc-asp-net-core/ 是一个去中心化的网上身份认证系统 ...
- IdentityServer4授权和认证对接数据库
接着上一篇讲:https://www.cnblogs.com/nsky/p/10352678.html 我们之前都是用in-men的方式把数据添加到内存了,目的是为了测试方便, 现在我们把所有配置都添 ...
- IdentityServer4认证服务器集成Identity&配置持久化数据库
文章简介 asp.net core的空Web项目集成相关dll和页面文件配置IdnetityServer4认证服务器 Ids4集成Identity Ids4配置持久化到数据库 写在最前面,此文章不详细 ...
- Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...
- asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证
文章简介 Ocelot网关简介 Ocelot集成Idnetity认证处理 Ocelot网关简介 Ocelot是一个基于netcore实现的API网关,本质是一组按特定顺序排列的中间件.Ocelot内 ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)
好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
随机推荐
- windows 上搭建gitblit
https://www.cnblogs.com/ucos/p/3924720.htmlhttps://www.cnblogs.com/sumuncle/p/6362697.htmlhttp://www ...
- C语言 · 8皇后问题
题目:8皇后问题 在8×8的棋盘上,放置8个皇后(棋子),使两两之间互不攻击.所谓互不攻击是说任何两个皇后都要满足: (1)不在棋盘的同一行: (2)不在棋盘的同一列: (3)不在棋盘的同一对角线上. ...
- iOS强制横屏或强制竖屏
原文链接 https://www.jianshu.com/p/d6cb54d2eaa1 亲测第二种我这边是阔以滴 第一种解决方案(不推荐,直接跳过看第二种解决方案): //强制转屏 - (void)i ...
- C++ STL堆操作
/* STL 最大堆.最小堆的应用 */ #include <iostream> #include <vector> #include <algorithm> // ...
- 【静默】在RHEL 6.5上静默安装Oracle 18c
[静默]在RHEL 6.5上静默安装Oracle 18c Oracle 18c.18c其实就是12.2.0.2,19c就是12.2.0.3.db_home.zip 安装包大概4.25G,解压后有8.9 ...
- python中的if __name__ == 'main'
当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用: 对于编程语言来说,程序都必须要有一个入口,比如java和c#必须要 ...
- tensorflow 调试tfdbg
1.执行pip install pyreadline 安装pyreadline 2.修改对应代码如下 with tf.Session() as sess: sess.run(tf.global_var ...
- JS精准倒计时(支持自定义模板)
/** * 倒计时 Create By TuJia @2017.10.17 * 使用方法: * leftTimer.run(container[,theme][,callback]); * * 支持 ...
- VUE组件的学习
参考:https://blog.csdn.net/baidu_23142899/article/details/79130225
- Lucene入门学习二
接上篇:增删改查 增加:这里不做过多阐述. 删除:删除全部,根据条件删除 修该:先删除,后添加 查询(*):查询所有,精确查询,根据数值范围查询,组合查询,解析查询. package com.ithe ...