通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问。那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠。
在微服务场景中,身份认证通常统一处理。一般有两种实现形式:
基于API 网关中心化认证:要求客户端必须都通过网关访问微服务。(这就要求提供一种安全机制来认证请求是来自于网关。)
基于安全令牌服务(STS)认证:所有的客户端先从STS获取令牌,然后请求时携带令牌完成认证。
Identity Service就是使用第二种身份认证方式。
Identity microservice 主要用于统一的身份认证和授权,为其他服务提供支撑。
提到认证,大家最熟悉不过的当属Cookie认证了,它也是目前使用最多的认证方式。但Cookie认证也有其局限性:不支持跨域、移动端不友好等。而从当前的架构来看,需要支持移动端、Web端、微服务间的交叉认证授权,所以传统的基于Cookie的本地认证方案就行不通了。我们就需要使用远程认证的方式来提供统一的认证授权机制。
而远程认证方式当属:OAuth2.0和OpenID Connect了。借助OAuth2.0和OpenID Connect即可实现类似下图的认证体系:
而如何实现呢,借助:
ASP.NET Core Identity
IdentityServer4
基于Cookie的认证和基于Token的认证的差别如下所示:
从目录结构可以看出它是一套MVC单层架构的网站。我们可以单独进行运行和调试,也可以把它放进自己的项目中。
主要依赖:
1、HealthCheck 健康检查
2、WebHost
3、Entity Framework
4、Autofac
5、IdentityServer4
6、其中IdentityServer4.AspNetIdentity又用到了ASP.NET Core Identity
Program.cs
Main函数:
1 public static void Main(string[] args) 2 { 3 BuildWebHost(args) 4 .MigrateDbContext<PersistedGrantDbContext>((_, __) => { }) 5 .MigrateDbContext<ApplicationDbContext>((context, services) => 6 { 7 var env = services.GetService<IHostingEnvironment>(); 8 var logger = services.GetService<ILogger<ApplicationDbContextSeed>>(); 9 var settings = services.GetService<IOptions<AppSettings>>(); 10 11 new ApplicationDbContextSeed() 12 .SeedAsync(context, env, logger, settings)//初始化默认登录用户种子数据 13 .Wait(); 14 }) 15 .MigrateDbContext<ConfigurationDbContext>((context, services) => 16 { 17 var configuration = services.GetService<IConfiguration>(); 18 19 new ConfigurationDbContextSeed() 20 .SeedAsync(context, configuration)//初始化identity server种子数据 21 .Wait(); 22 }).Run(); 23 }