IdentityService4简介

一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制。

前文

今天介绍ClientCredentials认证类型,适用于服务器与服务器之间身份验证,一般用于定时程序。

开始

我们需要的东西:

Api:负责提供数据,被保护进程

IdentityService4:负责提供身份认证等功能

客户端:负责在认证之后调用Api执行某些操作

IdentityService4初始化

IdentityService4(简称is4)有两种初始化方式:

1 使用命令行安装is4模板

1)安装模板命令:dotnet new -i IdentityServer4.Templates

2)安装完成之后执行dotnet new命令如下图所示多出了一些模板

3)使用dotnet cli创建一个is4empty模板,is4项目初始化完成

注:也可以使用其他已经配置好的模板

2 创建空.net core项目进行配置

1) 选择好要创建的文件夹之后选择创建空模板:

2) 使用nuget添加is4的包

install-package IdentityService4

注:is4会顺带装上serilog

3) 创建一个Config.cs文件,文件内包含三个静态字段

public static IEnumerable<IdentityResource> Ids

定义身份资源

public static IEnumerable<ApiResource> Apis

定义Api资源

public static IEnumerable<Client> Clients

定义客户端

4) 定义我们的Api资源:

public static IEnumerable<ApiResource> Apis =>

new ApiResource[]

{

new ApiResource("api1","My Api")

};

其中api1为我们定义的资源名,后面客户端请求的时候需要用到,而My Api好像是显示名称基本用不到。

5) 定义客户端:

public static IEnumerable<Client> Clients =>

new Client[]

{

new Client(){

ClientId="client",

AllowedGrantTypes=GrantTypes.ClientCredentials,

ClientSecrets={

new Secret("secret".Sha256())

},

AllowedScopes={ "api1"}

}

};

ClientId:客户端的Id可以理解为用户名

AllowedGrantTypes:指定认证的类型,这里为ClientCredentials类型

ClientSecrets:可以片面理解为密码

AllowedScopes:这个客户端可以请求到哪些资源

6) 对is4进行配置

我们需要在ConfigureServices对is4进行注入,很简单只需要将config里面的三个字段注入到指定方法即可:

var builder = services.AddIdentityServer()

.AddInMemoryIdentityResources(Config.Ids)

.AddInMemoryApiResources(Config.Apis)

.AddInMemoryClients(Config.Clients);

7) 添加中间件

我们目前只需要错误页中间件和is4中间件即可

if (Environment.IsDevelopment())

{

app.UseDeveloperExceptionPage();

}

app.UseIdentityServer();

至此为止我们is4已经配置完成,可以启动项目,访问http://localhost:5000/.well-known/openid-configuration,如果页面显示一大堆json那么证明我们成功了。

Api

1) 创建Api项目过程不在赘述,项目创建完成之后,在launchSettings.json 文件中将Api的启动端口设置5001,避免与is4项目冲突。

2) 添加依赖包:

程序依赖于Microsoft.AspNetCore.Authentication.JwtBearer按照添加is4包的方式添加。

3) 创建控制器

因为用于测试所以我们Home下只存在一个Index方法,并且在Index方法中打印出所有的Claims信息。

整个home应该是这样的:

[Route("api/[controller]")]

[ApiController]

[Authorize]  //加上认证特性

public class IdentityController : ControllerBase{

[HttpGet]

public IActionResult Get()

{

return new JsonResult(from c in User.Claims select new { c.Type, c.Value });

}

}

4) ConfigureServices与Configure

首先需要定义一个名叫Bearer的Jwt认证方案

services.AddAuthentication("Bearer")

.AddJwtBearer("Bearer", options =>

{

options.Authority = "http://localhost:5000";

options.RequireHttpsMetadata = false;

options.Audience = "api1";

});

Authority:规定jwt必须由http://localhost:5000发放

RequireHttpsMetadata:规定权限地址是否需要https,因为项目还没有使用https所以为false

Audience:请求的资源名称。 这个我感觉我理解的有问题,请各位指正

Configure中添加中间件:

app.UseAuthentication();

app.UseAuthorization();

至此我们已经写好了Api,只差最后的客户端。

客户端

ClientCredentials模式一般用于服务器与服务器之间身份验证所以我们创建一个控制台进行模拟。首先我们需要安装IdentityModel包,然后当我们需要访问Api时需要做一下操作:

1)请求发现文档

var client = new HttpClient();

var disco=await

client.GetDiscoveryDocumentAsync("http://localhost:5000");

返回值为一个类,类的属性存储对应处理方法的地址

2)获取一个token

var tokenResponse = await

client.RequestClientCredentialsTokenAsync(

new ClientCredentialsTokenRequest() {

Address=disco.TokenEndpoint,

ClientId= "client",

ClientSecret= "secret",

Scope= "api1"

});

注:需要设置id(账号),secret(密码),scope(要请求的资源名称),其返回值时一个token

3)给httpclient设置头

client.SetBearerToken(tokenResponse.AccessToken);

4)请求Api,打印出返回的值

var response = await

client.GetAsync("http://localhost:5001/api/Identity");

var content = await response.Content.ReadAsStringAsync();

Console.WriteLine(JArray.Parse(content));

5) 打印结果:

总结

is4中配置时设定的clientid,ClientSecrets,资源名称等,要与客户端请求/api验证对应起来

is4中config的三个字段要定义完整

各个程序记得按顺序写好中间件

发现文档中有所有的地址

客户端请求时要记得设置http头

本文仅用于个人笔记,如果有错误请各位指正,谢谢!

IdentityService4学习笔记之Client Credentials的更多相关文章

  1. [No000091]SVN学习笔记2-TortoiseSVN Client初级操作update(获取)、commit(提交)

    SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...

  2. redis 学习笔记(2)-client端示例代码

    redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...

  3. IdentityService4学习笔记之Authorization Code

    前文 本文所有内容来自官方文档,如果有写不明白的地方请下方留言或查看官方文档. 今天介绍Authorization Code模式,适用于保密类型的客户端,保密类型客户端可以理解为在服务器端生成页面(比 ...

  4. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  5. OAuth2.0学习(1-7)授权方式4-客户端模式(Client Credentials Grant)

    授权方式4-客户端模式(Client Credentials Grant) 客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提 ...

  6. gPRC学习笔记

    gPRC学习笔记 gPRC基础教程. gPRC官方文档. protobuf 3.0的简易教程. 什么是RPC RPC(remote procedure call) -- 远程过程调用(相对于本地调用的 ...

  7. Cobalt Strike学习笔记

    Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透测试工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java ...

  8. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  9. SpringBoot学习笔记(十五:OAuth2 )

    @ 目录 一.OAuth 简介 1.什么是OAuth 2.OAuth 角色 3.OAuth 授权流程 4.OAuth授权模式 4.1.授权码 4.2.隐藏式 4.3.密码式 4.4.凭证式 二.实践 ...

随机推荐

  1. 用SignApk.jar对APK进行签名

    对apk签名需要使用SignApk.jar和签名文件.可以使用Android源码获取,若没有源码,可以在这下载:SignApk.jar.(包含了SignApk.jar和签名文件和批处理文件) 1 Si ...

  2. Scrum冲刺博客

    一.各个成员在Alpha阶段认领的任务 已完成 二.各个成员的任务安排 三.整个项目期的任务量 按实际考试情况以及开发情况决定,初始计划是完成登录以及个人目标版块的完整功能,其它版块共进,保证最终能够 ...

  3. 一不小心把windows资源管理器给结束任务了 电脑黑屏了 怎么处理

    按键盘上的三个键,Ctrl+Shift+Esc来启动任务管理器: 在任务管理器界面的左上角,有一个“文件”按钮,点击它会出现下拉的“新建任务(运行)...”按钮 鼠标点了“新建任务(运行)...”会弹 ...

  4. 002-OpenStack-认证服务

    OpenStack-认证服务 [基于此文章的环境]点我快速打开文章 1.安装和配置 控制节点(controller) 1.1 创库授权 keystone mysql CREATE DATABASE k ...

  5. CSS的四种基本选择器和四种高级选择器

    做个快乐的搬运工:https://blog.csdn.net/DYD850804/article/details/80997251

  6. Python3——根据m3u8下载视频(下)之requests

    下半场ING,好吧,本来准备明天写的(拖延真快乐.gif),请然而,,,早上八点多跑公司加班(看书+学习)去,发现大门上挂着一把大锁,我只想说门禁是拿来看的嘛,加啥破锁o(╥﹏╥)o,严重打击了好员工 ...

  7. 201871010105-曹玉中《面向对象程序设计(java)》第七周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  8. android主流开源自动化框架(monkeyrunner,robotium,uiautomator)转载

    摘要: android自动化框架小结:monkey,monkeyrunner,cts,robotium,uiautomator android自动化框架: Uiautomator: 优点:可以对所有操 ...

  9. zz扔掉anchor!真正的CenterNet——Objects as Points论文解读

    首发于深度学习那些事 已关注写文章   扔掉anchor!真正的CenterNet——Objects as Points论文解读 OLDPAN 不明觉厉的人工智障程序员 ​关注他 JustDoIT 等 ...

  10. CSS制作导航栏

    最终效果: 代码: <!DOCTYPE html> <html> <head> <title>#练习册二</title> <style ...