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的更多相关文章

  1. IdentityServer4授权和认证

    IdentityServer4 简称ids4 oidc了解:http://www.jessetalk.cn/2018/04/04/oidc-asp-net-core/ 是一个去中心化的网上身份认证系统 ...

  2. IdentityServer4授权和认证对接数据库

    接着上一篇讲:https://www.cnblogs.com/nsky/p/10352678.html 我们之前都是用in-men的方式把数据添加到内存了,目的是为了测试方便, 现在我们把所有配置都添 ...

  3. IdentityServer4认证服务器集成Identity&配置持久化数据库

    文章简介 asp.net core的空Web项目集成相关dll和页面文件配置IdnetityServer4认证服务器 Ids4集成Identity Ids4配置持久化到数据库 写在最前面,此文章不详细 ...

  4. Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

    写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...

  5. asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证

    文章简介  Ocelot网关简介 Ocelot集成Idnetity认证处理 Ocelot网关简介 Ocelot是一个基于netcore实现的API网关,本质是一组按特定顺序排列的中间件.Ocelot内 ...

  6. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)

    好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...

  7. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)

    在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot ...

  8. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)

    在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...

  9. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

随机推荐

  1. dma 测试例子

    #include <linux/module.h> #include <linux/slab.h> #include <linux/sched.h> #includ ...

  2. surface shader获取像素深度差值

    void vert (inout appdata_full v, out Input i) { UNITY_INITIALIZE_OUTPUT(Input, i); i.proj = ComputeS ...

  3. bash计算上下行数据差值

    for i in {1..60000}; do echo "`date +'%F %T'` `df /dev/md0 | grep 'data1'` "; sleep 1; don ...

  4. Android Studio中解决jar包重复依赖导致的代码编译错误

    在原本的代码中已经使用了OKHTTP和rxjava,然后今天依赖retrofit的时候一直报错 Program type already present: okhttp3.internal.ws.Re ...

  5. 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题

    map阶段 1. 使用job.setInputFormatClass(TextInputFormat)做为输入格式.注意输出应该符合自定义Map中定义的输出. 2. 进入Mapper的map()方法, ...

  6. windows环境下命令打到服务中

    1.正常redis在本地命令行中启动,现在直接在服务中启动(tomcat同理) cmd下命令如下: sc create redis binPath= D:\redis\redis-server.exe ...

  7. linux中,当执行rpm -e删除一个软件包时,都做了些什么事

    问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...

  8. CF 634A Island Puzzle

    A. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. docker参数注解

    # docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ -h ...

  10. 前端页面展示MySQL数据并实现前后端互动

    前端页面使用H-ui框架  后端使用flask框架  数据库使用mysql  连接数据库通过pymysql实现 前端代码如下 <html lang="en"> < ...