其他分享
首页 > 其他分享> > Net Core 微服务 - 搭建 IdentityServer4 认证授权服务,实践最简单的OAuth2.0客户端模式

Net Core 微服务 - 搭建 IdentityServer4 认证授权服务,实践最简单的OAuth2.0客户端模式

作者:互联网

OAuth2.0

1、OAuth2.0概念

OAuth2.0(Open Authorization)是一个开放授权协议;第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户资源

OAuth的步骤一般如下:

1、客户端要求用户给予授权
2、用户同意给予授权
3、根据上一步获得的授权,向认证服务器请求令牌(token)
4、认证服务器对授权进行认证,确认无误后发放令牌
5、客户端使用令牌向资源服务器请求资源
6、资源服务器使用令牌向认证服务器确认令牌的正确性,确认无误后提供资源

该协议的参与者至少包含:

RO (resource owner): 资源所有者:用户。

RS (resource server): 资源服务器:数据中心;它存储资源,并处理对资源的访问请求。如:API资源,相册服务器、博客服务器。

AS (authorization server): 授权服务器

Client: 第三方应用

 

2、授权模式

四种模式:

1、授权码模式(authorization code)

    授权码模式与隐式模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token。这比隐式模式更为安全。从应用场景上来区分的话,隐式模式适应于全前端的应用,授权码模式适用于有后端的应  用,因为客户端根据授权码去请求token时是需要把客户端密码转进来的,为了避免客户端密码被暴露,所以请求token这个过程需要放在后台。


2、隐式模式(implicit)

    Implicit要么仅用于服务端和JavaScript应用程序端进行身份认证,要么用于身份身份验证和access token的传输。

    在Implicit中,所有token都通过浏览器传输的。

    适用场景:JavaScript应用程序。


3、密码模式(resource owner password credentials

    该方式发送用户名和密码到token endpoint,向资源服务器请求令牌。这是一种“非交互式”授权方法。

    官网上称,为了解决一些历史遗留的应用场景,所以保留了这种授权方式,但不建议使用。

    适用场景:用于当前的APP是专门为服务端设计的情况。


4、客户端模式(client credentials

  这是一种最简单的授权方式,应用于服务于服务之间的通信,token通常代表的是客户端的请求,而不是用户。

    使用这种授权类型,会向token endpoint发送token请求,并获得代表客户机的access token。客户端通常必须使用token endpoint的Client ID和secret进行身份验证。

    适用场景:用于和用户无关,服务与服务之间直接交互访问资源

 下面过程搭建 IdentityServer4 认证授权服务,实践最简单的OAuth2.0客户端模式

 

1、通过VS 2019 创建一个.Net Core Web 项目(Net 5.0)

 

 设置App URL为: http://localhost:8100

2、通过NuGet安装 IdentityServer4 包,下图是我已经安装好了的截图

 

 

3、添加一个配置文件Config.cs

using IdentityServer4.Models;
using System.Collections.Generic;

namespace HY.IdentityServer4
{
    public class Config
    {
        public static IEnumerable<ApiScope> GetApiScopes()
        {
            return new List<ApiScope>
            {
                new ApiScope("IdentityApiService"),
            };
        }

        /// <summary>
        /// 获取可授权的API资源
        /// </summary>
        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                //ApiResources为数组类型, 表示IdentityServer管理的所有的下游服务列表
                //Name: 下游服务名称
                //DisplayName: 下游服务别名
                new ApiResource("IdentityApiService", "IdentityApiServiceName")
                {
                    Scopes = { "IdentityApiService" }
                }
            };
        }
        /// <summary>
        /// 获取可授权的客户端
        /// </summary>
        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
            {
                //Clients为数组类型,表示IdentityServer管理的所有的上游客户端列表

                //ClientId: 客户端ID
                //ClientSecrets: 客户端对应的密钥
                //AllowedGrantTypes: 该客户端支持的认证模式
                //AllowedScopes: 该客户端支持访问的下游服务列表, 必须是在ApiResources列表中登记的
                new Client
                {
                    ClientId = "apihy",

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

                    // 用于认证的密码

                    ClientSecrets =
                    {
                        new Secret("secret".Sha256())
                    },
                    // 客户端有权访问的范围(Scopes)
                    AllowedScopes =
                    {
                        "IdentityApiService"
                    }
                }
            };
        }
    }
}

 

4、在Startup.cs 里注册 IdentityServer4 

 ConfigureServices() 方法里面注册IdentityServer4 服务

services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryApiScopes(Config.GetApiScopes())
            .AddInMemoryClients(Config.GetClients());

 Configure() 方法里面添加使用 IdentityServer4 中间件

app.UseIdentityServer();

5、配置完成

  启动项目,访问 http://localhost:8100/.well-known/openid-configuration (我的端口号是8100) ,可以浏览文档,参考下图,说明已经配置成功。

 

配置完成后,尝试向IdentityServer进行认证。因为需要使用post方式,而且在认证请求的body中加入认证信息,所以我这里借助Postman工具完成。

请求路径:http://localhost:8100/connect/token
如果认证成功,会看到如下图所示的access_token信息。这里注意传递的参数格式是x-www-form-urlencoded, 其他方式无效。

 

 



标签:Core,认证,token,服务器,授权,Net,OAuth2.0,IdentityServer4,客户端
来源: https://www.cnblogs.com/SF8588/p/15325357.html