微服务身份认证,授权


什么是身份认证

身份认证是指当客户端访问服务端资源时,验证客户端是否合法的一种机制

什么是授权

授权就是指当客户端经过身份认证后,能够有限的访问服务端资源的一种机制

为什么要使用身份验证和授权

为了保证服务端资源的安全,我们要理解必须从真实项目中去理解

身份认证和授权方式有哪些 3种

? 1、Base认证

? Base64编号认证  如果用base64就要加https 安全性相对低

? 2、Digest认证

? MD5消息摘要认证 == https 也要在https下认证

? 3、Bearer认证

? 就是基于token(电子身份证)认证,讲用户信息等其他信息转换成为token,然后以token进行认证

? token认证是一种无状态的认证方式,能够无限扩展,特别适合做单点登录

? 3.1 OAuth 2.0 ==== 授权方式的认证

? 3.2 JWT的也是一种身份认证

? token 分两种类型

   引用类型token(不存储用户得相关的信息) == OAuth 2.0   无用户相关信息

?   自包含token  有用户相关信息  JWT === 地址,电话,id,等

 

 在实际分布式项目中,大部分都是使用Bearer来进行身份认证和身份授权

? 在分布式项目或者微服务项目中,为了保证系统统一登录(SSO登录),

? 使用OpenID协议标准来规范身份认证功能 === 规范

? 同时使用OAuth 2.0协议标准来规范权限访问 === 规范

? 为了将身份认证(单点登录)和授权结合起来,所以出现了OpenID Connect协议标准 === 接口

? OpenID Connect = OpenID + OAuth 2.0

? SSO+OAuth 2.0可以实现单点登录和授权

? IdentityServer4 也可以实现单点登录和授权

? 然后综合实现了这些框架就是IdentityServer4 身份认证服务器

如何在项目中使用IdentityServer4

IdentityServer4 是什么

? IdentityServer是基于OpenID Connect协议标准的身份认证和授权程序,它实现了OpenID Connect 和 OAuth 2.0 协议。

IdentityServer4 功能

保护你的资源 使用本地帐户或通过外部身份提供程序对用户进行身份验证 提供会话管理和单点登录 管理和验证客户机 向客户发出标识和访问令牌 验证令牌

IdentityServer4 内部概念

下面对以下几个转用术语进行解释

用户(User) 用户是使用已注册的客户端(指在id4中已经注册)访问资源的人。

客户端(Client)

客户端就是从identityserver请求令牌的软件(你可以理解为一个app即可),既可以通过身份认证令牌来验证识别用户身份,又可以通过授权令牌来访问服务端的资源。但是客户端首先必须在申请令牌前已经在identityserver服务中注册过。

实际客户端不仅可以是Web应用程序,app或桌面应用程序(你就理解为pc端的软件即可),SPA,服务器进程等。

资源(Resources)

资源就是你想用identityserver保护的东东,可以是用户的身份数据或者api资源。 每一个资源都有一个唯一的名称,客户端使用这个唯一的名称来确定想访问哪一个资源(在访问之前,实际identityserver服务端已经配置好了哪个客户端可以访问哪个资源,所以你不必理解为客户端只要指定名称他们就可以随便访问任何一个资源)。

用户的身份信息实际由一组claim组成,例如姓名或者邮件都会包含在身份信息中(将来通过identityserver校验后都会返回给被调用的客户端)。

API资源就是客户端想要调用的功能(通常以json或xml的格式返回给客户端,例如webapi,wcf,webservice),通常通过webapi来建立模型,但是不一定是webapi,我刚才已经强调可以使其他类型的格式,这个要看具体的使用场景了。

身份令牌(顾名思义用于做身份认证,例如sso其实主要就是用于身份认证) id_token jwt 一个身份令牌指的就是对认证过程的描述。它至少要标识某个用户(Called the sub aka subject claim)的主身份信息,和该用户的认证时间和认证方式。但是身份令牌可以包含额外的身份数据,具体开发者可以自行设定,但是一般情况为了确保数据传输的效率,开发者一般不做过多额外的设置,大家也可以根据使用场景自行决定。

访问令牌(用于做客户端访问授权) access_token oauth 2.0 访问令牌允许客户端访问某个 API 资源。客户端请求到访问令牌,然后使用这个令牌来访问 API资源。访问令牌包含了客户端和用户(如果有的话,这取决于业务是否需要,但通常不必要)的相关信息,API通过这些令牌信息来授予客户端的数据访问权限。

 

微服务中使用IdentityServer4

IdentityServer4 官网地址

中文地址:http://www.identityserver.com.cn/Home/Detail/Zhengtizongshu

英文地址:https://identityserver4.readthedocs.io/en/3.1.0/

客户端认证模式

条件

1、IdentityServer4 授权服务器(IdentityServer)

导入IdentityServer4包

 

2、客户端(Client)

 

3、微服务系统(Resources)

4、用户

 步骤

1、NutGet下载IdentityServer4 在资源服务器中

1.1、在IOC容器中配置IdentityServer4

// 1、ioc容器中添加IdentityServer4
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()// 1、用户登录配置
            .AddInMemoryApiResources(Config.GetApiResources()) // 2、存储Api资源
            .AddInMemoryClients(Config.GetClients()) // 3、存储客户端(模式)

1.2、使用IdentityServer4

// 1、使用IdentityServe4
      app.UseIdentityServer();    
      //2、添加静态资源访问
            app.UseStaticFiles();

1.3、配置测试用户Config类

/// 
    /// 1、Identity测试使用
    /// 
    public class Config
    {
        /// 
        /// 1、微服务API资源
        /// 
        /// 
        public static IEnumerable GetApiResources()
        {
            return new List
            {
                new ApiResource("TeamService", "TeamService api需要被保护")
            };
        }
   /// 
    /// 2、客户端
    /// 
    /// 
    public static IEnumerable GetClients()
    {
        return new List
        {
            new Client
            {
                ClientId = "client",

                // 没有交互性用户,使用 clientid/secret 实现认证。
                AllowedGrantTypes = GrantTypes.ClientCredentials,

                // 用于认证的密码
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },
                // 客户端有权访问的范围(Scopes)
                AllowedScopes = { "TeamService" }
            }
        };
    }
}    

 2、微服务配置

? 2.1 Nuget下载IdentityServer4.AccessTokenValidation

? 2.2 配置身份和授权认证(配置认证资源,让资源服务器进行保护)

 // 6、校验AccessToken,从身份校验中心进行校验
            services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                    .AddIdentityServerAuthentication(options => {
                        options.Authority = "http://localhost:5005"; // 1、授权中心地址
                        options.ApiName = "TeamService"; // 2、api名称(项目具体名称)
                        options.RequireHttpsMetadata = false; // 3、https元数据,不需要
                    });    

? 2.3 开启身份认证

app.UseAuthentication(); // 1、使用身份验证    

? 3、客户端配置

? 3.1 Nuget下载IdentityModel