一.前言

本文已更新到 .NET Core 2.2
本文包括后续的Demo都会放在github:https://github.com/stulzq/IdentityServer4.Samples (QuickStart的几个Demo随着本系列的更新,目前为从官方Demo仓库的拷贝,防止本文和Demo不匹配,因为官方Demo和文档一直在更新,本系列更新速度可能会慢一步)。
这里特别说明一下:快速入门以及Topic系列为了保持到最新,目前几乎都是翻译的官方文档(以往的不适合最新版本就换掉了),需要深入一点的请看实战系列。

二.使用客户端认证保护API

此示例介绍了使用IdentityServer保护API的最基本场景。

在这种情况下,我们将定义一个API和要访问它的客户端。 客户端将在IdentityServer上请求访问令牌,并使用它来访问API。

三.准备

创建一个名为QuickstartIdentityServer的ASP.NET Core Web 空项目(asp.net core 2.2),端口5000
创建一个名为Api的ASP.NET Core Web Api 项目(asp.net core 2.2),端口5001
创建一个名为Client的控制台项目(.net core 2.2)

四.定义API、Identity资源

QuickstartIdentityServer项目中添加一个Config.cs文件:

public static class Config{public static IEnumerable<IdentityResource> GetIdentityResources(){return new IdentityResource[]{new IdentityResources.OpenId()};}public static IEnumerable<ApiResource> GetApis(){return new List<ApiResource>{new ApiResource("api1", "My API")};}public static IEnumerable<Client> GetClients(){return new List<Client>{new Client{ClientId = "client",// no interactive user, use the clientid/secret for authenticationAllowedGrantTypes = GrantTypes.ClientCredentials,// secret for authenticationClientSecrets ={new Secret("secret".Sha256())},// scopes that client has access toAllowedScopes = { "api1" }}};}}

五.定义客户端

对于这种情况,客户端将不具有交互式(人机交互)用户,并将使用IdentityServer的客户端模式进行身份验证。 将以下代码添加到Config.cs文件中:

public static IEnumerable<Client> GetClients()
{return new List<Client>{new Client{ClientId = "client",// no interactive user, use the clientid/secret for authenticationAllowedGrantTypes = GrantTypes.ClientCredentials,// secret for authenticationClientSecrets ={new Secret("secret".Sha256())},// scopes that client has access toAllowedScopes = { "api1" }}};
}

六.配置 IdentityServer

要配置IdentityServer以使用Scope和客户端定义,您需要向ConfigureServices方法添加代码。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{var builder = services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryIdentityResources(Config.GetIdentityResources()).AddInMemoryApiResources(Config.GetApis()).AddInMemoryClients(Config.GetClients());// rest omitted
}public void Configure(IApplicationBuilder app)
{if (Environment.IsDevelopment()){app.UseDeveloperExceptionPage();}// uncomment if you want to support static files//app.UseStaticFiles();app.UseIdentityServer();// uncomment, if you wan to add an MVC-based UI//app.UseMvcWithDefaultRoute();
}

运行此项目,打开浏览器访问http://localhost:5000/.well-known/openid-configuration你将会看到IdentityServer的各种元数据信息。

首次启动时,IdentityServer将为您创建一个开发人员签名密钥,它是一个名为tempkey.rsa的文件。 您不必将该文件检入源代码管理中,如果该文件不存在,将重新创建该文件。

七.添加API

在项目Api中添加一个Controller:IdentityController

[Route("identity")]
[Authorize]
public class IdentityController : ControllerBase
{[HttpGet]public IActionResult Get(){return new JsonResult(from c in User.Claims select new { c.Type, c.Value });}
}

最后一步是将身份验证服务添加到DI和身份验证中间件到管道。 这些将:

  • 验证传入令牌以确保它来自受信任的颁发者
  • 验证令牌是否有效用于此API(也称为 audience)

将Startup更新为如下所示:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddMvcCore().AddAuthorization().AddJsonFormatters();services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>{options.Authority = "http://localhost:5000";options.RequireHttpsMetadata = false;options.Audience = "api1";});}public void Configure(IApplicationBuilder app){app.UseAuthentication();app.UseMvc();}
}

AddAuthentication 将身份认证服务添加到DI,并将“Bearer”配置为默认方案。 AddIdentityServerAuthentication 将 IdentityServer Token 认证处理程序添加到DI中以供身份认证服务使用。 UseAuthentication 将身份认证中间件添加到管道中,因此将在每次调用API时自动执行身份验证。

如果在浏览器访问(http:// localhost:5001/identity),你会得到HTTP 401的结果。 这意味着您的API需要凭据。

就是这样,API现在受 IdentityServer 保护。

八.创建客户端

为 "Client" 项目添加 Nuget 包:IdentityModel

IdentityModel 包括用于发现 IdentityServer 各个终结点(EndPoint)的客户端库。这样您只需要知道 IdentityServer 的地址 - 可以从元数据中读取实际的各个终结点地址:

// discover endpoints from metadata
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");
if (disco.IsError)
{Console.WriteLine(disco.Error);return;
}

DiscoveryClient 已在最新版移除

接下来,您可以使用从 IdentityServer 元数据获取到的Token终结点请求令牌:

// request token
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{Address = disco.TokenEndpoint,ClientId = "client",ClientSecret = "secret",Scope = "api1"
});if (tokenResponse.IsError)
{Console.WriteLine(tokenResponse.Error);return;
}Console.WriteLine(tokenResponse.Json);

九.调用API

要将Token发送到API,通常使用HTTP Authorization标头。 这是使用SetBearerToken扩展方法完成的:

// call api
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);var response = await client.GetAsync("http://localhost:5001/identity");
if (!response.IsSuccessStatusCode)
{Console.WriteLine(response.StatusCode);
}
else
{var content = await response.Content.ReadAsStringAsync();Console.WriteLine(JArray.Parse(content));
}

输出应如下所示:

默认情况下,Token将包含有关 Scope,生命周期(nbf和exp),客户端ID(client_id)和颁发者名称(iss)的身份信息单元(Claim)。

十.使用Postman调试

十一.项目所用代码

github地址: https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/1_ClientCredentials

转载于:https://www.cnblogs.com/stulzq/p/7495129.html

IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)相关推荐

  1. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]

    在<原理篇>中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证 ...

  2. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]

    在<通过扩展自行实现服务授权>一文中,我通过自定义CallContextInitializer的方式在操作方法之前之前根据认证用户设置了当前线程的安全主体,从而实现授权的目的.实际上,WC ...

  3. .NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据

    内容:本文带大家使用IdentityServer4进行对API授权保护的基本策略 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 本文将要讲述如何使用IdentityServer4 ...

  4. 11 控制对象访问:代理模式

    1.引入 1.0 联系JAVA知识 Java中的  动态代理 和 静态代理  这两个知识点也就是代理模式的知识点. 1.1 需求引入 接着第10张 状态模式的例子接着向下进行: 糖果机已经可以取得糖果 ...

  5. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的Demo需求. 按照既定的要求,我们的API会提供给众多的客户端使用, 这些客户端可以是各种Web站点, ...

  6. (chap8 确认访问用户身份的认证) SSL客户端认证

    SSL客户端认证是借由HTTPS的客户端证书完成的认证方式.凭借客户端整数认证,服务器可确认访问是否来自自己登陆的客户端. 1. 步骤 step1. 接收到需要认证资源的请求,服务器会发送 Certi ...

  7. 如何在Tomcat中做TLS客户端认证

    常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度,而不是其他人伪造的网站.同时还对流量加 ...

  8. API 客户端认证那些事.

    签名认证机制 1.设置key密钥. 2.假设参数 appid:wx930ea5d5a258f4f much_id:10000100 device_info:1000 body:test nonce_s ...

  9. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

    上篇文章介绍了如何使用Dapper持久化IdentityServer4(以下简称ids4)的信息,并实现了sqlserver和mysql两种方式存储,本篇将介绍如何使用ids4进行客户端授权. .ne ...

最新文章

  1. Connot resolve Symbol '.......'
  2. 携手广通,聚焦ITIL——BROADA举办首届BTE认证培训
  3. 入股壹品生鲜签约仪式 农业大健康·李喜贵:谋定功能性农产品
  4. 即时通讯音视频开发(八):常见的实时语音通讯编码标准
  5. Python Django 一对多之插入多条数据示例
  6. kafka实现异步发送_Kafka Producer 异步发送消息居然也会阻塞?
  7. 备份linux系统报错_Linux 系统如何快速入门?分享民工哥总结的经验
  8. linux 基础训练,Linux 基础训练习题
  9. python3 selenium安装教程_Mac OS下搭建 python3+pycharm+selenium+Chrome环境
  10. Python注释的写作笔记
  11. A blog from Sensory
  12. Linux环境中清除tomcat缓存
  13. android日记论文摘要,(毕业论文)基于android的日记本的设计与开发.doc
  14. k-max-pooling
  15. Hololens连接mysql_学校hololens开发项目:汽车发动机检修混合现实(MR)教学
  16. kbhit(), bioskey(), system(pause)
  17. 如何解决Excel文档已损坏呢?
  18. gcc -Wl,--wrap,malloc 替换系统函数
  19. 利用CSS改变图片颜色的多种方法!
  20. ZUCC操作系统原理 周测1

热门文章

  1. ipa文件怎么安装到iphone_无视签名随意安装 IPA 文件
  2. linux 新分区使用1%,linux下使用fdisk结合partprobe命令不重启系统添加一块新的磁盘分区...
  3. linux系统外接硬盘_linux通过fstab自动挂载外接磁盘
  4. 不规则图形数格子的方法_小学数学,怎么数平面图形中长方形与正方形个数
  5. mysql5.5 datetime默认值不能为NOW或者CURRENT_TIMESTAMP
  6. 【Zabbix】使用dbforbbix 2.2-beta监控Redhat 7.0上的Oracle、Mysql
  7. linux如何生成tar文件内容,linux如何使用tar命令创建Tar.Gz压缩文件
  8. java中索引超出怎么办_Java-字符串索引超出范围异常“字符串索引超出范围”
  9. router-link标签学习
  10. 给定数组 求和等于固定值 算法_别人家的面试题:不可变数组快速范围求和