IdentityServer4实现.Net Core API接口权限认证(快速入门)

 

什么是IdentityServer4

官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现。

通俗来讲,就是服务端对需要认证授权的资源(客户端请求资源)在外层使用IdentityServer4框架进行封装加壳,用户只能通过获取IdentityServer4颁发的Token令牌才能进行资源访问。

下面开始进入正题,如何快速搭建实现API接口鉴权。

准备:1.下载准备NetCore sdk环境

2.本文开发环境为VS2019,部分代码可能和之前的版本不同。

第一步,新建权限认证服务项目,本文以Net Core API项目模板为例(也可以选择其他模板)

第二步,添加IdentityServer4 Nuget程序包。不同版本依赖的NetCoe sdk环境不同,需手动选择合适版本。

这里提醒一下,有些同学的系统可能添加Nuget程序包时,发现无法找到程序包。我们这里找出了解决方法,点击Nuget程序包添加页面的右上角设置按钮,看到如下页面,手动添加如下的nuget.org,然后重新搜索即可。

第三步,添加IdentityServer4配置管理类。本文以用户密码授权模式为例。

 1 public class Config
2 {
3 /// <summary>
4 /// 定义资源范围
5 /// </summary>
6 public static IEnumerable<ApiResource> GetApiResources()
7 {
8 return new List<ApiResource>
9 {
10 new ApiResource("api1", "我的第一个API")
11 };
12 }
13
14 /// <summary>
15 /// 定义访问的资源客户端
16 /// </summary>
17 /// <returns></returns>
18 public static IEnumerable<Client> GetClients()
19 {
20 return new List<Client>
21 {
22 new Client{
23 ClientId="client",//定义客户端ID
24 ClientSecrets=
25 {
26 new Secret("secret".Sha256())//定义客户端秘钥
27 },
28 AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,//授权方式为用户密码模式授权,类型可参考GrantTypes枚举
29 AllowedScopes={ "api1"}//允许客户端访问的范围
30
31 }
32 };
33 }
34
35 /// <summary>
36 /// 这个方法是来规范tooken生成的规则和方法的。一般不进行设置,直接采用默认的即可。
37 /// </summary>
38 /// <returns></returns>
39 public static IEnumerable<IdentityResource> GetIdentityResources()
40 {
41 return new IdentityResource[]
42 {
43 new IdentityResources.OpenId()
44 };
45 }
46 }

第四步,Startup启动类中注册服务中间件

 1 // This method gets called by the runtime. Use this method to add services to the container.
2 public void ConfigureServices(IServiceCollection services)
3 {
4 services.AddIdentityServer()//注册服务
5 .AddDeveloperSigningCredential()
6 .AddInMemoryApiResources(Config.GetApiResources())//配置类定义的授权范围
7 .AddInMemoryClients(Config.GetClients())//配置类定义的授权客户端
8 .AddTestUsers(new List<TestUser> { new TestUser { Username = "Admin", Password = "123456", SubjectId = "001", IsActive = true } });//模拟测试用户,这里偷懒了,用户可以单独管理,最好不要直接在这里New
9 services.AddControllers();
10 }
11
12 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
13 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
14 {
15 if (env.IsDevelopment())
16 {
17 app.UseDeveloperExceptionPage();
18 }
19
20 app.UseIdentityServer();//添加中间件
21
22 app.UseHttpsRedirection();
23
24 app.UseRouting();
25
26 app.UseAuthorization();
27
28 app.UseEndpoints(endpoints =>
29 {
30 endpoints.MapControllers();
31 });
32 }

应用程序默认的端口号有两种:1.http://localhost:5000   2.https://localhost:5001.

到这里,Identityserver4鉴权服务已经简单搭建完成。我们直接在VS中启动项目。并在端口号后面加上/.well-known/openid-configuration,出现如下页面则表示配置成功。

第五步,PostMan模拟请求获取token(当然这一步非必须,对postman感兴趣的同学可以试一试)

我们都知道IdentityServer4需要客户端先访问鉴权服务获取token令牌,才能进一步访问加权的服务器资源。我们这里先通过PostMan模拟客户端请求,获取Token。(postman工具大家可以网上下载,也可以使用谷歌自带的postman插件)

1.使用postman请求token时,有个地方需要注意下:

很多同学在使用https请求时,即请求https://localhost:5001,会发现无法成功。因为postman默认把SSL证书认证打开了,我们可以手动关闭掉。找到postman页面右上方的小扳手图标,进入设置页面找到ssl关掉即可。当然同学们直接使用http://localhost:5000请求就无需设置SSL.

2.请求参数

这里的参数value就是我们在鉴权服务配置类设置的client和TestUser信息。

Grant_Type为授权类型,本文我们使用的是用户密码模式,所以这里填password.

这里我们看到,我们已成功模拟请求获取了Token。大功告成,鉴权服务已验证可用,我们赶紧去发布部署吧。

第六步,鉴权服务发布部署。

.Net Core发布模式有三种:

1.框架依赖+可移植

2.框架依赖+运行时环境(带可执行程序exe)

3.独立部署

简单来说,框架依赖模式发布的程序包,都需要部署环境自带.net core等运行环境;而独立部署则不需要考虑,发布包已经包含了运行环境,直接部署即可。

下面本文以框架依赖+可移植发布,做简单介绍。

发布完成后,我们会在发布路径中看到程序dll.我们找到发布路径,通过CMD命令窗口:dotnet xxx.dll可直接启动。

如上,则表示启动成功。(如果其他发布模式,直接双击发布包中可执行exe文件即可启动)

鉴权服务部署完成后,我们API接口如何使用呢,下面开始正式介绍。

第一步:新建Web Api项目

添加Nuget程序包

第二步:配置启动类

 1         public void ConfigureServices(IServiceCollection services)
2 {
3 //注册服务
4 services.AddAuthentication("Bearer")
5 .AddIdentityServerAuthentication(x =>
6 {
7 x.Authority = "http://localhost:5000";//鉴权服务地址
8 x.RequireHttpsMetadata = false;
9 x.ApiName = "api1";//鉴权范围
10 });
11 services.AddControllers();
12 }
13
14 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
15 {
16 if (env.IsDevelopment())
17 {
18 app.UseDeveloperExceptionPage();
19 }
20 app.UseAuthentication();//添加鉴权认证
21 app.UseHttpsRedirection();
22 app.UseRouting();
app.UseAuthorization();
23 app.UseEndpoints(endpoints =>
24 {
25 endpoints.MapControllers();
26 });
27 }

应用程序默认的端口号有两种:1.http://localhost:5000   2.https://localhost:5001.为了避免端口号冲突被占用,我们可以在Program类中修改应用程序启动端口号

1  public static IHostBuilder CreateHostBuilder(string[] args) =>
2 Host.CreateDefaultBuilder(args)
3
4 .ConfigureWebHostDefaults(webBuilder =>
5 {
6 webBuilder.UseUrls("http://*:5555");//设置启动端口号
7 webBuilder.UseStartup<Startup>();
8 });

第三步:创建API  DEMO

 1  [Route("api/[controller]")]
2 [ApiController]
3 public class TestController : ControllerBase
4 {
5 // GET: api/Test
6 /// <summary>
7 /// 方法加权
8 /// </summary>
9 /// <returns></returns>
10 [Authorize]
11 [HttpGet]
12 public IEnumerable<string> Get()
13 {
14 return new string[] { "value1", "value2" };
15 }
16
17 /// <summary>
18 /// 方法未加权 可直接访问
19 /// </summary>
20 /// <param name="id"></param>
21 /// <returns></returns>
22 // GET: api/Test/5
23 [HttpGet("{id}", Name = "Get")]
24 public string Get(int id)
25 {
26 return "value";
27 }
28
29 /// <summary>
30 /// 开放获取token API 接口
31 /// </summary>
32 /// <returns></returns>
33 [HttpGet("GetToken")]
34 public async Task<string> GetToken()
35 {
36 var client = new HttpClient();
37 var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
38 {
39 Address = "http://localhost:5000/connect/token",
40 ClientId = "client",
41 ClientSecret = "secret",
42 Scope = "api1",
43 UserName = "Admin",
44 Password = "123456",
45 });
46
47 if (tokenResponse.IsError)
48 {
49 return tokenResponse.Error;
50 }
51
52 return tokenResponse.AccessToken;
53
54 }
55 }

1.接口方法上加上:

[Authorize]

相当于对接口加权,只有被授权的用户才能访问(即获取token的用户)。此时上文中接口api/Test由于被加权,请求时会报错;但是api/Test/1接口未加权,仍可正常请求。

那么我们如何才能访问被加权的接口呢???Go Next

2.我们这里开放了获取Token的接口GetToken(类似于上文中通过PostMan获取Token)

访问被加权的API接口,我们这里需要先请求获取Token,然后请求加权接口时带上token参数。

3.请求加权接口

 请求加权接口时带上Token,接口请求成功!

OK,关于如何快速开发和调试基于IdentityServer4框架的API接口鉴权服务,至此我们已介绍完毕。

小弟不才,本文中有考虑不周全或错误的地方,欢迎大家指正。

(如果有的同学想通过IIS部署API应用程序,这里有个地方需要注意下,需要在IIS(功能视图——模块)中添加AspNetCoreModule模块。具体原因本文就不在这里介绍了。)

IdentityServer4 系列文章01---密码授权模式的更多相关文章

  1. 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍 ...

  2. Learn-JavaScript-with-MDN 系列文章: 01. var & let & const 对比

    Learn-JavaScript-with-MDN 系列文章: 01. var & let & const 对比 var & let & const 区别 https: ...

  3. Spring Cloud2.0之Oauth2环境搭建(授权码模式和密码授权模式)

    oauth2 server 微服务授权中心,    github源码  https://github.com/spring-cloud/spring-cloud-security 对微服务接口做一些权 ...

  4. IdentityServer4(8)- 使用密码认证方式控制API访问(资源所有者密码授权模式)

    一.前言 本文已经更新到 .NET Core 2.2 OAuth 2.0 资源所有者密码模式允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌. 除了通过无法浏览器进行交互的应用程序之外 ...

  5. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  6. IdentityServer4 (2) 密码授权(Resource Owner Password)

    写在前面 1.源码(.Net Core 2.2) git地址:https://github.com/yizhaoxian/CoreIdentityServer4Demo.git 2.相关章节 2.1. ...

  7. IdentityServer4 实现自定义 GrantType 授权模式

    OAuth 2.0 默认四种授权模式(GrantType): 授权码模式(authorization_code) 简化模式(implicit) 密码模式(password) 客户端模式(client_ ...

  8. (十)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(二)授权模式

    一.前言 先交代一下整个Demo项目结构: 一个认证服务(端口5000)IdentityServer4.Authentication 五个授权模式(两个控制台程序,三个MVC项目端口5001)文件夹G ...

  9. IdentityServer4 自定义授权模式

    IdentityServer4除了提供常规的几种授权模式外(AuthorizationCode.ClientCredentials.Password.RefreshToken.DeviceCode), ...

  10. IdentityServer4系列之中文文档及实际项目经验分享

    0.前言 原文:http://docs.identityserver.io/en/release/声明: 1.目录一至五章节根据IdentityServer英文文档翻译而来,有些内容会根据自己的理解来 ...

随机推荐

  1. CIO们开始将软件供应链升级为安全优先级top

    开源之所以在软件开发中大量使用的原因是它提供了经过良好测试的构建块,可以加速复杂应用程序和服务的创建.但是第三方软件组件以及包和容器的便利性同时也带来了风险--软件供应链攻击. 软件供应链攻击日益普遍 ...

  2. Kubernetes(K8S) 监控 Prometheus + Grafana

    监控指标 集群监控 节点资源利用率 节点数 运行Pods Pod 监控 容器指标 应用程序 Prometheus 开源的 监控.报警.数据库 以HTTP协议周期性抓取被监控组件状态 不需要复杂的集成过 ...

  3. 开放 LLM 排行榜: 深入研究 DROP

    最近,开放 LLM 排行榜 迎来了 3 个新成员: Winogrande.GSM8k 以及 DROP,它们都使用了 EleutherAI Harness 的原始实现.一眼望去,我们就会发现 DROP ...

  4. 使用 DPO 微调 Llama 2

    简介 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback,RLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步 ...

  5. Codeforce 1335C - Two Teams Composing 统计技能种类数量+统计同一技能最大数量

    7 4 2 4 1 4 3 4 统计技能种类数量 4种不同技能 统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量4) 选出 技能4(数量4) 作为 第2组 扣除 ...

  6. Codeforce:455A. Boredom (DP)

    https://codeforces.com/problemset/problem/455/A 题意: 给出n个元素,让我们来挑选,如果选了 \(a_k\),获得\(a_k\)点数,同时与\(a_{k ...

  7. 【每日一题】12.Running Median (对顶堆)

    补题链接:Here 题意:动态的维护中位数的问题,依次读入一个整数,每当总个数为奇数时输出此时序列的中位数 使用对顶堆的在线做法. 为了实时找到中位数,我们可以建议两个二叉堆:一个小根堆.一个大根堆. ...

  8. PVE API创建虚拟机

    度娘,谷歌都搜了一圈没有找到通过PVE API创建虚拟机的方式, 于是查官网自己试了试,部分代码抄的Sam Liu大佬的作业,感谢大佬. python代码如下: import requests # s ...

  9. C#设计模式03——简单工厂的写法

    什么是C#简单工厂? C#简单工厂是一种创建对象的设计模式,它定义一个工厂类来创建指定类型的对象,而不是在客户端代码中直接创建对象.简单工厂模式通常使用静态方法来生成对象,并且这些静态方法通常被称为工 ...

  10. 机器学习-线性回归-损失函数+正则化regularization-06

    目录 1. 为什么要加上正则项 2 L1稀疏 L2平滑 3. 代码1--L2正则 4 代码2--L2正则2 5. 代码3--l1正则 6. ElasticNet 1. 为什么要加上正则项 防止模型的过 ...