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