tnblog
首页
视频
资源
登录

.net core 3.1 Identity Server4 (ClientCredentials模式)

5554人阅读 2020/12/7 19:34 总访问:3254339 评论:0 收藏:0 手机
分类: Ids4

.netcore

.net core 3.1 Identity Server4 (ClientCredentials模式)

ClientCredentials 模式的理解

在这之前我先问大家一个小问题:倘若你要请假,请问你会怎么做?
我想很多人都会想到走流程。
如果你是一名学生,你得找老师开一张请假条,然后大门保安检验请假条有效过后才会放你走。
如果你是一名工作者,你就得找领导开一张请假条,然后同上。
大致如下图所示:

如下图所对照,然后大家把其中的角色换一下。接下来我们将创建相关项目。

你国人 客户端
老师/领导 授权服务器
保安 Api
请假条 授权验证码(Access Token)
请假 需要鉴权的端口

创建授权服务器(AiDaSi.OcDemo.Authenzation)

安装依赖包 IdentityServer4.我这里使用版本是 4.1.1.

Package Reference

  1. <ItemGroup>
  2. <PackageReference Include="IdentityServer4" Version="4.1.1" />
  3. </ItemGroup>

Package Manager

  1. Install-Package IdentityServer4 -Version 4.1.1

创建Config.cs服务器资源配置文件

引用命名空间

  1. using IdentityServer4.Models;

文件内容

  1. public class Config
  2. {
  3. public static List<ApiScope> GetApiResources()
  4. {
  5. return new List<ApiScope>
  6. {
  7. new ApiScope("ApiOne") // 这里可以想象成门卫叫什么名字
  8. };
  9. }
  10. public static List<Client> GetClients()
  11. {
  12. return new List<Client>
  13. {
  14. new Client
  15. {
  16. ClientId = "client", // 客户端Id
  17. ClientName = "Internal cluster usage", // 客户端名称
  18. AllowedGrantTypes = GrantTypes.ClientCredentials, //创建ClientCredentials模式的客户端
  19. ClientSecrets =
  20. {
  21. new Secret("secret".Sha256()) //带验证码
  22. },
  23. // 客户端有权访问的范围(Scopes)
  24. AllowedScopes = { "ApiOne" }
  25. }
  26. };
  27. }
  28. }

修改Startup.cs

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllers();
  4. // 使用内存存储,密钥,客户端和资源来配置身份服务器。
  5. services.AddIdentityServer()
  6. .AddDeveloperSigningCredential() //开发者凭证,在首次启动时,IdentityServer将为您创建一个开发人员签名密钥,该文件名为tempkey.jwk。您不必将该文件签入源代码管理中,如果不存在该文件将被重新创建。
  7. .AddInMemoryApiScopes(Config.GetApiResources()) // 配置资源(门卫),计3.0后改用Scope
  8. .AddInMemoryClients(Config.GetClients()); // 配置客户端(你国人也在里面)
  9. }
  10. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  11. {
  12. ...
  13. app.UseIdentityServer();
  14. ...
  15. app.UseAuthorization();
  16. ...
  17. }

修改launchSettings.json,这里我指定授权地址为:http://localhost:7200

  1. {
  2. "profiles": {
  3. "AiDaSi.OcDemo.Authenzation": {
  4. "commandName": "Project",
  5. "launchBrowser": true,
  6. "launchUrl": "weatherforecast",
  7. "applicationUrl": "http://localhost:7200",
  8. "environmentVariables": {
  9. "ASPNETCORE_ENVIRONMENT": "Development"
  10. }
  11. }
  12. }
  13. }

创建Api(ApIDemo1)

安装依赖包 IdentityServer4.AccessTokenValidation.我这里使用版本是 3.0.1.

Package Reference

  1. <ItemGroup>
  2. <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
  3. </ItemGroup>

Package Manager

  1. Install-Package IdentityServer4.AccessTokenValidation -Version 3.0.1

修改WeatherForecastController.cs

  1. [Authorize] //需要认证才可以访问
  2. public IEnumerable<WeatherForecast> Get()

修改Startup.cs

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services
  4. .AddAuthentication("Bearer")
  5. .AddJwtBearer("Bearer", config =>
  6. {
  7. config.Authority = "http://localhost:7200"; // 授权服务器地址
  8. //确定自己是哪个资源(资源名称)
  9. config.Audience = "ApiOne";
  10. config.RequireHttpsMetadata = false; // 是否使用https进行通信
  11. //取消验证用户以及验证角色
  12. config.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
  13. {
  14. ValidateIssuer = false,
  15. ValidateAudience = false
  16. };
  17. });
  18. services.AddControllers();
  19. }
  20. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  21. {
  22. ...
  23. app.UseRouting();
  24. app.UseAuthentication();
  25. app.UseAuthorization();
  26. ...
  27. }

修改launchSettings.json,这里我指定接口地址为:http://localhost:5280

  1. {
  2. "profiles": {
  3. "ApIDemo1": {
  4. "commandName": "Project",
  5. "launchBrowser": true,
  6. "launchUrl": "weatherforecast",
  7. "applicationUrl": "http://localhost:5280",
  8. "environmentVariables": {
  9. "ASPNETCORE_ENVIRONMENT": "Development"
  10. }
  11. }
  12. }
  13. }

添加 MSTest 项目(TestApi)

修改UnitTest1

  1. public async Task TestMethod1()
  2. {
  3. var client = new HttpClient();
  4. // 获取配置文档信息相当于访问:http://localhost:7200/
  5. // http://localhost:7200/.well-known/openid-configuration
  6. var disco = await client.GetDiscoveryDocumentAsync("http://localhost:7200/");
  7. if (disco.IsError)
  8. {
  9. Console.WriteLine(disco.Error);
  10. return;
  11. }
  12. // 获取access Token(拿请假条)
  13. var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
  14. {
  15. Address = disco.TokenEndpoint,
  16. ClientId = "client",
  17. ClientSecret = "secret",
  18. Scope = "ApiOne"
  19. });
  20. if (tokenResponse.IsError)
  21. {
  22. Console.WriteLine(tokenResponse.Error);
  23. return;
  24. }
  25. // call Identity Resource API
  26. var apiClient = new HttpClient();
  27. // 设置Access Token(拿请假条给门卫)
  28. apiClient.SetBearerToken(tokenResponse.AccessToken);
  29. var response = await apiClient.GetAsync("http://localhost:5280/WeatherForecast");
  30. if (!response.IsSuccessStatusCode)
  31. {
  32. Console.WriteLine(response.StatusCode);
  33. }
  34. else
  35. {
  36. var content = await response.Content.ReadAsStringAsync();
  37. Console.WriteLine(JArray.Parse(content));
  38. }
  39. Console.ReadKey();
  40. }

启动项目

分别在 授权服务器项目资源项目 目录下,打开powershell工具执行dotnet run,让项目跑起来。然后我们访问一下:http://localhost:7200/.well-known/openid-configuration 授权服务器全局配置地址。

首先我们直接访问(会被保安拦截下来),获取不到数据

获取Token

获取到数据

分析请求

在第一次请求获取Access Token的时候,我们通过 Fiddler 工具可以看到它是这样请求的。关于参数大家可以参考这篇文章:https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/


我们也可以通过 PostMan 工具模拟一下请求

请求Api,可以通过这样的方式


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

ServiceStack.Redis操作Redis配置单例模式

我携漫天星辰以赠你,仍觉漫天星辰不如你。单利的应该是连接池而不应该是redis对象。如果每次操作都是一个redis对象是会有...

GIT中的PR模式

GIT中的Pull Request模式(简称PR)PR是开发者使用Github进行协作的利器。PR是协作者修改代码后或在原基础上增加新代码后向...

EF三种模式解析

万般皆下品,惟有编程高我希望你是为我而来如果我爱你,而你也正巧爱我。你头发乱了时候,我会笑笑地替你拨一拨,然后,手...

identity server4 的授权模式

授权模式OAuth2.0 定义了四种授权模式:Implicit:简化模式;直接通过浏览器的链接跳转申请令牌。Client Credentials:客户...

identity server4 四种授权模式

爱情哪有那么复杂,能让你开开心心笑得最甜的那个人就是对的人下面介绍4种模式安全性从低到高客户端模式客户端模式只对客户...

IdentityServer4实现OAuth2.0四种模式之授权码模式

授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token。这...

也谈TDD,以及三层架构、设计模式、ORM……

想在园子里写点东西已经很久了,但一直没有落笔,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因...

.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)

.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)[TOC] 中介者模式 用一个中介对象封装一系列的对象交...

.net core 3.1 Identity Server4 (Password模式)

.net core 3.1 Identity Server4 (Password模式)[TOC] Password 模式的理解 当应用程序将用户的用户名和密码交换为...

.net core 3.1 Identity Server4 (Code模式)

.net core 3.1 Identity Server4 (Code模式)[TOC] Code 模式的理解 大致说一下,这种授权模式的意义。A. 用户通...

Go Map与工厂模式,在Go语言中实现Set

Go Map与工厂模式,在Go语言中实现Set[TOC] Map与工厂模式 Map 的 value 可以是一个方法与 Go 的 Dock type 接口方式一起...

.net core 3.1 Identity Server4 (Implicit模式)

.net core 3.1 Identity Server4 (Implicit模式)[TOC] Implicit 模式的理解 A.用户通过浏览器访问客户端,然后客...

.net core 3.1 Identity Server4 (Hybrid模式)

.net core 3.1 Identity Server4 (Hybrid模式)[TOC] Hybrid 模式的理解 Hybrid 模式相当于(Code模式+Impact模式),所...

.net core 3.1 Identity Server4 (自定义模式)

.net core 3.1 Identity Server4 (自定义模式)[TOC] IdentityServer4除了提供常规的几种授权模式外(AuthorizationCod...

策略设计模式需要的4大步骤

1:策略接口类: 是对策略, 算法的抽象. 定义了每个策略和算法必须有的算法和属性.2:策略实现类: 策略,算法的具体实现. 策...
这一世以无限游戏为使命!
排名
2
文章
620
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术