Identity Server 4是IdentityServer的最新版本,它是流行的OpenID Connect和OAuth Framework for .NET,为ASP.NET Core和.NET Core进行了更新和重新设计。认证原理基于JWT,符合JWT流程。关于Identity Server 4的介绍和使用,网上已经很多了,一搜一大堆,本篇文章就不在介绍,这里有几篇文章还不错,作为一个参考:

1,《ASP.NET Core的身份认证框架IdentityServer4--入门》,这篇文章是翻译的国外的一篇文章,对于入门很有启发,英文原文地址:https://www.scottbrady91.com/Identity-Server/Getting-Started-with-IdentityServer-4

2,《使用JWT搭建分布式无状态身份认证系统》,这篇文章介绍JWT,以及怎么不引用Identity Server 4,手动写JWT认证服务。了解一下JWT原理和代码实现即可,如果在实际项目中用,不必再“造轮子”。

3,《IdentityServer4 中文文档与实战》,这是按照官方文档来研究的系列文章,从入门到实践。

 

本篇文章使用的环境:VS2017,15.9.11,目标框架:.NET Core 2.2

ASP.NET Core的无状态身份认证框架IdentityServer4

在项目中使用的步骤:

1,新建一个空的解决方案

ASP.NET Core的无状态身份认证框架IdentityServer4

2,在解决方案里新建项目,选择ASP.NET Core Web应用程序

ASP.NET Core的无状态身份认证框架IdentityServer4

3,目标框架选择 Core 2.2 (或其他的Core版本),选择“应用程序(模型视图控制器)”

ASP.NET Core的无状态身份认证框架IdentityServer4

ASP.NET Core的无状态身份认证框架IdentityServer4

4,打开项目属性,选择“调试”选项,删除默认的启动项

 ASP.NET Core的无状态身份认证框架IdentityServer4

5,创建一个新的启动项,名称定为:WebAPPHost,把端口指定到5002(或者其他不与本地冲突的端口)

 ASP.NET Core的无状态身份认证框架IdentityServer4

6,生成的launchSettings.json如下

{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:31509",
"sslPort": 44328
}
},
"profiles": {
"WebAppHost": {
"commandName": "Project",
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5002"
}
}

 ASP.NET Core的无状态身份认证框架IdentityServer4

 7,删除不必要的文件、文件夹。(作为服务提供的项目,只提供API接口,不需要页面)

 ASP.NET Core的无状态身份认证框架IdentityServer4

8,在NuGet中引入IdentityServer 4 

ASP.NET Core的无状态身份认证框架IdentityServer4

9,新建一个文件夹IdentityServer,用于放IdentityServer相关的文件。

 9.1首先创建一个IdentityServerClients类,定义两个方法:IEnumerable<Client> GetClients() 和 List<TestUser> GetTestUsers()

GetClients方法是IdentityServer客户端(访问控制列表)集合,GetTestUsers方法是定义IdentityServer的测试用户。代码如下:

 1 public class IdentityServerClients
 2     {
 3         /// <summary>
 4         /// IdentityServer客户端(访问控制列表)
 5         /// </summary>
 6         /// <returns></returns>
 7         public static IEnumerable<Client> GetClients()
 8         {
 9             var list = new List<Client>
10             {
11                 new Client
12                 {
13                     ClientId = "client",
14                     AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
15                     AllowedScopes = {"WebAppAPI" },//添加允许访问API范围
16                     AllowOfflineAccess = true,
17                     AccessTokenLifetime = 60 * 60,
18                     RefreshTokenExpiration = TokenExpiration.Sliding,
19                     SlidingRefreshTokenLifetime = 60 * 30,
20                     RefreshTokenUsage = TokenUsage.ReUse,
21                     ClientSecrets =
22                     {
23                         new Secret("D7896FC26CAC97942DEF0402322524BB".Sha256())
24                     }
25                 }
26             };
27 
28             return list;
29         }
30 
31         /// <summary>
32         /// IdentityServer的测试用户
33         /// </summary>
34         /// <returns></returns>
35         public static List<TestUser> GetTestUsers()
36         {
37             List<TestUser> Testers = new List<TestUser>()
38             {
39                 new TestUser()
40                 {
41                     SubjectId = "1",
42                     Password ="111111",
43                     Username = "admin001"
44                 },
45                 new TestUser()
46                 {
47                     SubjectId = "2",
48                     Password ="222222",
49                     Username = "admin002"
50                 }
51             };
52 
53             return Testers;
54         }
55     }
View Code

相关文章: