一、前言
在前面的篇章介绍中,一些基础配置如API资源、客户端资源等数据以及使用过程中发放的令牌等操作数据,我们都是通过将操作数据和配置数据存储在内存中进行实现的,而在实际开发生产中,我们需要考虑如何处理数据持久化呢?
这时「IdentityServer4」具有良好的扩展性,其中一个可扩展点是用于「IdentityServer」所需数据的存储机制,进行持久化操作。
下面将如何配置「IdentityServer」以使用「EntityFramework」(EF)作为此数据的存储机制把这些数据存储到「Sql Server」数据库, 这样更符合我们实际生产环境的需求。
二、初识
在我们的 「IdentityServer4」中官方定义的两个上下文,是有两种类型的数据需要持久化到数据库中:
❝1、「配置数据」(资源、客户端、身份);//这里是对应配置上下文 「
ConfigurationDbContext
」2、「IdentityServer」在使用时产生的 「操作数据」(令牌,代码和用户的授权信息consents);//这里是对应操作上下文 「
❞PersistedGrantDbContext
」
「这两个上下文以及对应的数据模型,已经被 IdentityServer4 官方给封装好了」, 我们不需要做额外的操作,直接进行迁移即可使用。
2.1 ConfigurationDb
ConfigurationDbContext
(IdentityServer configuration data) —— 负责数据库中对客户端、资源和 CORS 设置的配置存储;
如果需要从 EF 支持的数据库加载客户端、标识资源、API 资源或 CORS 数据 (而不是使用内存中配置), 则可以使用配置存储。此支持提供 IClientStore
、IResura Store
和 ICorsPolicyService
扩展性点的实现。这些实现使用名为 ConfigurationDbContext
的 「dbcontext」 派生类对数据库中的表进行建模。
2.2 PersistedGrantDb
PersistedGrantDbContext
(IdentityServer operational data.) -—— 负责存储同意、授权代码、刷新令牌和引用令牌;
如果需要从 EF 支持的数据库 (而不是默认的内存数据库) 加载授权授予、同意和令牌 (刷新和引用), 则可以使用操作存储。此支持提供了 IPersistedGrantStore
扩展点的实现。实现使用名为 PersistedGrantDbContext
的 「dbcontext」 派生类对数据库中的表进行建模。
三、实践
3.1 新建站点
建立一个MVC的Asp.Net Core项目 ,使用MVC模板
3.2 Nuget包
IdentityServer4.EntityFramework
以及EF相关包
1.IdentityServer4
2.IdentityServer4.AspNetIdentity
3.IdentityServer4.EntityFramework
因为本文中使用的是SqlServer
数据库,所以需要安装对应的EF程序包对数据库的支持。
Microsoft.EntityFrameworkCore.SqlSe