asp.net-identity - 使用 IdentityServer4、Asp.Net Core Identity 和自定义提供程序进行 Blazor WebAssembly 身份验证,无需实体框架
问题描述
我有一个 Blazor 服务器端应用程序,它使用 CosmosDB 的自定义身份提供程序,但不使用实体框架。我想将应用程序转换为托管在 Asp.net Core 上的 Blazor WebAssembly。
我的 Blazor 服务器端 Startup.cs 自定义提供程序如下所示:
services.AddTransient<IRoleStore<ApplicationRole>, CosmosDBRoleStore<ApplicationRole>>();
services.AddTransient<IUserStore<ApplicationUser>, CosmosDBUserStore<ApplicationUser>>();
services.AddIdentity<ApplicationUser, ApplicationRole>().AddDefaultTokenProviders();
services.AddAuthentication();
services.AddAuthorization();
托管在 Asp.net Core 上的 Visual Studio for Blazor WebAssembly 的当前模板在Asp.Net Core Identity + SQL Server 之上使用 Identity Server4,它需要来自 Entity Framework Core 的 DBContext。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentityServer().AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
services.AddAuthentication().AddIdentityServerJwt();
我安装了自定义 Cosmos DB 身份提供程序,但是该行
services.AddIdentityServer().AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
需要实体框架 DBContext 来填充 IdentityServer4 的所有参数。
我分析了四种情况:
1) 在我的自定义身份提供程序之上使用实体框架,但它几乎需要完全重新编码,因为它使用深度自定义的 CosmosDB 集成与自定义登录/注销/注册等页面。
2)在我的自定义提供程序之上使用 Identity Server4,但我是新手,整个框架很复杂,所有带有 Asp.Net Core Identity 的示例也使用实体框架,我不知道该怎么做它。
3) 删除我的自定义身份提供程序并使用 Azure B2C。经过一些测试,我发现它很乱,很难定制,有弹出窗口和无品牌的确认电子邮件。这也将使自定义配置文件编辑页面上的数周工作无效。
4) 将项目保留在 Blazor 服务器端,不要迁移
我有什么遗漏可以帮助解决问题吗?任何可以帮助使用不使用实体框架的自定义身份提供程序配置 IdentityServer4 的库?
解决方案
经过几天的测试,我终于能够实现我想要的:
“将 Blazor Server 应用程序移植到托管在 Asp.net Core 上的 Blazor WebAssembly,保留我的自定义 Asp.net Identity + CosmosDB 提供程序,而无需使用 Identity Server 4 和 Entity Framework。”
我创建了 JWT 令牌身份验证服务 + 状态提供程序的手动实现,并将其连接到 Asp.Net Core Identity。
我使用这个项目作为指南,其中包含一个完整的工作 JWT 实现:
推荐阅读
- mongodb - MongoDb:如何从 .gz 文件导入转储数据?
- html - 在行下方添加元素
- windows - 如何批量获取另一个驱动器的当前工作目录?
- android - PreferenceActivity:getFragmentManager() 已被弃用
- sql - 如何在sql server的存储过程中为单个参数传递更多值
- ios - 如何为使用 apache tomcat 服务器提供的 APPLE APP SITE ASSOCIATION 设置 MIME 类型?
- django - Nginx、Gunicorn、Django、Celery(Redis):上游过早关闭连接502网关
- angular - 同一组件中的不同Highcharts(Angular 5)
- linq - Linq 相当于一个 Sql 查询
- php - 致命错误:instagram 爬虫中的未捕获错误