.net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims

导读

1. 如何添加自定义的claims.

前请提要

目前我们拥有了三个web应用.

  1. localhost:40010, 验证服务器
  2. localhost:40011, mvc客户端, 充当webapp请求者
  3. 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都能拿到

原文地址:https://www.cnblogs.com/jianjialin/p/9310785.html

时间: 2024-10-10 08:43:10

.net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims的相关文章

Ocelot简易教程(五)之集成IdentityServer认证以及授权

原文:Ocelot简易教程(五)之集成IdentityServer认证以及授权 Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 Ocelot简易教程(四)之请求聚合以及服务发现 Ocelot简易教程(五)之集成IdentityServer认证以及授权 Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据 Ocelot简易教程(七)之配

第16章 使用ASP.NET Core Identity

注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么ASP.NET Identity是您可以选择的一个选项.本快速入门显示了如何在IdentityServer中使用ASP.NET Identity. 本快速入门使用ASP.NET Identity的方法是为IdentityServer Host创建一个新项目.这个新项目将取代我们在之前的快速入门中构建的

Identity和IdentityServer的区别及联系

关于Identity和IdentityServer初学的时候可能会有一些疑惑(虽然我也不是很精深吧),但是,这里说一下自己关于这两者的一些理解,如有错误,欢迎指正 总体上, ASP.NET Core Identity提供了一个用来管理和存储用户账户的框架. IdentityServer是一个中间件,它可以添加符合OpenID Connect和OAuth2.0的终端(endpoints)到一个任意的ASP.NET Core应用. 关于Identity ASP.NET Core Identity 是

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)

在 使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(1) 中,IdentityServer4 使用的是内存数据,不方便灵活,这次要把 IdentityServer4 的数据也保存到数据库中. 添加 IdentityServer4.EntityFramework IdentityServer4 有两种类型的数据需要保存数据库中.第一是配置数据(资源和客户端).第二个是 IdentityServer 在使用时产生的操作数据(令牌,代码和同意).这些存

在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器

新建 ASP.NET Core Identity 项目 在新建ASP.NET Core Web 应用程序 窗口中分别选择:ASP.NET Core 2.0,Web应用程序(模型视图控制器)和个人用户账号 项目建立后, 运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息. 打开launchSettings.json: { "profiles": { "IdentityManagerServer": { "commandName

ASP.NET Core Identity Hands On(1)——Identity 初次体验

ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格.登录和用户数据存储 这是来自于 ASP.NET Core Identity 仓库主页的官方介绍,如果你是个萌新你可能不太理解什么是成员资格,那我来解释一下,成员资格由 membership 直译而来, membership 还有会员资格.会员身份.会员全体等相关含义,我们可以将其简单直接但并非十分恰当的理解为用户管理系统 ASP.NET Core Identity(下文简称I

用例子看ASP.NET Core Identity是什么?

原文:用例子看ASP.NET Core Identity是什么? 目录 前言 基于声明的认证(Claims-based Authentication) Claim 在ASP.NET Core Identity中是如何实现的 类ClaimsPrincipal 考察另外一个重要的类ClaimsIdentity 在ASP.NET Core Identity中一同运行 总结 @ 前言 有三个重要的类Claim, ClaimsIdentity, ClaimsPrincipal,我们以一个持有合法证件的学生

基于Jenkins Pipeline的ASP.NET Core持续集成实践

原文:基于Jenkins Pipeline的ASP.NET Core持续集成实践 最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下. 一.关于持续集成与Jenkins Pipeline 1.1 持续集成相关概念 互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI) . 持续集成指的是,频繁地 (一天多次) 将代码集成到

Asp.Net Core Identity 完成注册登录

Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微软.Facebook.google.QQ.微信等 提供了一个丰富的API,并且这些API还可以进行大量的扩展 接下来我们先来看下它的简单使用.首先在我们的DbContext中需要继承自IdentityDbContext. public class AppDbContext:IdentityDbCon