IdentitySrever4
一、身份认证和授权
1.1、身份认证
当客户端访问服务器端资源时,验证客户端是否合法的一种机制。
1.2、授权
当客户端经过身份认证后,能够有限的访问服务端资源的一种机制。
1.3、身份认证和授权方式
- Base认证:Base64编码认证(https) 。
- Digest认证:MD5消息摘要认证(https) 。
- Bearer认证:基于token(电子身份证)认证,将用户信息等其他信息转换为token,然后进行token认证。token认证是一种无状态认证方式,能够进行无限扩展,特别适合做单点登录。包括两种:OAuth 2.0,JWT
1.5、OAth 2.0 与 JWT区别
OAth 2.0 属于引用型token,无用户相关信息。
JWT属于自包含token,有用户相关信息。如地址,电话,id等。
1.6、实际项目方案
实际项目方案中,大多采用Bearer进行身份认证和授权。
1.7、关系
OAuth 2.0 是一种授权框架。用于应用程序之间安全的共享用户资源。它允许用户授权第三方应用程序访问他们的资源。而不必将用户名和密码提供给第三方应用程序 。它定义了授权流程和令牌的颁发、刷新和撤销等机制,但没有规定具体的令牌格式。
JWT是一种令牌的具体实现方式。 轻量级的、基于JSON的安全令牌,用于在用户和服务之间传递声明。在OAuth 2.0中,JWT通常被用作访问令牌(access token)或者身份验证令牌(identity token),用于在客户端和资源服务器之间传递用户的授权信息。OAuth 2.0和JWT之间的关系是,OAuth 2.0定义了授权流程和令牌的使用规范,而JWT是在这个框架下用于实现令牌的一种具体格式。OAuth 2.0可以使用JWT作为访问令牌,以实现安全的用户授权和资源访问。
IdentityServer是一个开源的身份认证和授权服务器,它实现了OpenID Connect和OAuth 2.0协议,可以作为一个独立的认证服务器,也可以与其他应用程序集成。它提供了一种安全的方式来管理用户身份和授权访问资源。
1.8、授权模式
二、IdentityServer4
2.1、功能
保护资源,使用本地账户或通过外部身份提供程序,对用户进行身份验证。
提供会话管理和单点登录,管理和验证客户机,向客户发出表示和访问令牌,验证令牌。
2.2、概念
- 用户。使用已注册(指id4中已经注册)访问资源的人。
- 客户端。从id4请求令牌的软件(app等),既可以通过身份认证令牌来验证 识别用户身份,又可以通过授权令牌来访问服务端的资源。前提是客户端必须在申请令牌前 已经在Id4服务中注册过。
- 资源。就是用id4保护的东西,可以是用户的身份数据或者api资源。 每个资源有位移名称,客户端使用唯一名称来确定想访问哪一个资源。(实际上,Id4服务端已经配置好那个客户端可以访问哪个资源,不是客户端想访问哪个就能访问,都提前安排了的。)用户身份信息实际由一组claim组成,如姓名或者邮件都会包含在身份信息中(将来通过Id4校验后都会返回给被调用的客户端)。
- 身份令牌。token,jwt。(例如sso其实主要就是用于身份认证身份令牌)指的就是对认证过程的描述。它至少要标识某个用户(Called the sub aka subject claim)的主身份信息,和该用户的认证时间和认证方式。但是身份令牌可以包含额外的身份数据,具体开发者可以自行设定,但是一般情况为了确保数据传输的效率,开发者一般不做过多额外的设置,大家也可以根据使用场景自行决定。
- 访问令牌。(用于做客户端访问授权)。访问令牌允许客户端访问某个 API 资源。客户端请求到访问令牌,然后使用这个令牌来访问 API资源。访问令牌包含了客户端和用户(如果有的话,这取决于业务是否需要,但通常不必要)的相关信息,API通过这些令牌信息来授予客户端的数据访问权限。
三、项目
3.1、IdentityServer中心
1、新建Core API。然后新增Config类
using IdentityServer4.Models; namespace Id4Center { public class Config { /// <summary> /// 添加Scope /// </summary> /// <returns></returns> public static List<ApiScope> GetApiResources() { return new List<ApiScope> { new ApiScope("ApiOne") }; } /// <summary> /// 添加客户端 /// </summary> /// <returns></returns> public static List<Client> GetClients() { return new List<Client> { new Client { ClientId = "Client", // 客户端Id ClientName = "ClientApi", // 客户端名称 AllowedGrantTypes = GrantTypes.ClientCredentials, //创建ClientCredentials模式的客户端 ClientSecrets = { new Secret("secret".Sha256()) //带验证码 }, // 客户端有权访问的范围 AllowedScopes = { "ApiOne" } } }; } } }
2、Program配置
我使用的是.NET Core 7,要是Core 5或者5以下版本,在startup配置。
#region IdentityServer 4 配置 builder.Services.AddIdentityServer() .AddDeveloperSigningCredential() //开发者凭证,在首次启动时,IdentityServer将为您创建一个开发人员签名密钥,该文件名为tempkey.jwk。您不必将该文件签入源代码管理中,如果不存在该文件将被重新创建。 .AddInMemoryApiScopes(Config.GetApiResources()) // 配置资源 .AddInMemoryClients(Config.GetClients()); // 配置客户端 #endregion
//添加IdentityServer app.UseIdentityServer(); //添加授权 app.UseAuthentication();
3、运行测试
URl地址: localhost:44355/.well-known/openid-configuration
4、postman测试token地址
需要注意的几个地方已经标注出来了。
3.2、整体逻辑
四、运行截图
4.1、鉴权中心截图
运行地址:localhost:5000/.well-known/openid-configuration
特别注意这个:"token_endpoint": "http://localhost:5000/connect/token",他是获取token的url地址。
4.2、资源中心测试
4.3、客户端的截图
五、说明
运行客户端程序,需要先运行鉴权中心和资源中心。可以用文件路径+cmd+dotnet run
六、代码
鉴权中心地址:链接
资源中心地址:链接
客户端地址:链接
七、小结
本文所有程序都已全部测试通过。