使用 IdentityServer4、Asp.Net Core Identity 和自定义提供程序进行 Blazor WebAssembly 身份验证,无需实体框架

Posted

技术标签:

【中文标题】使用 IdentityServer4、Asp.Net Core Identity 和自定义提供程序进行 Blazor WebAssembly 身份验证,无需实体框架【英文标题】:Blazor WebAssembly Authentication with IdentityServer4, Asp.Net Core Identity and custom provider without Entity Framework 【发布时间】:2020-09-14 23:53:29 【问题描述】:

我有一个 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();

Visual Studio for Blazor WebAssembly 中的当前模板托管在 Asp.net Core 上使用了 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 的库?

【问题讨论】:

独立的 WebAssembly 怎么样?它被配置为使用 OpenID Connect... 我在 AspNetCore GitHub 上创建了一个问题 github.com/dotnet/aspnetcore/issues/23253 【参考方案1】:

经过几天的测试,我终于能够实现我想要的:

“将 Blazor Server 应用程序移植到托管在 Asp.net Core 上的 Blazor WebAssembly,保留我的自定义 Asp.net Identity + CosmosDB 提供程序,而不使用 Identity Server 4 和 Entity Framework。”

我创建了 JWT 令牌身份验证服务 + 状态提供程序的手动实现,并将其连接到 Asp.Net Core Identity。

我使用这个项目作为指南,其中包含一个完整的 JWT 实现:

https://github.com/CodeMazeBlog/blazor-series/tree/blazor-webassembly-authentication-aspnetcore-identity

【讨论】:

以上是关于使用 IdentityServer4、Asp.Net Core Identity 和自定义提供程序进行 Blazor WebAssembly 身份验证,无需实体框架的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4实战 - 与API单项目整合

IdentityServer4 使用OpenID Connect添加用户身份验证

如何测试我的令牌是不是使用 IdentityServer4 刷新?

IdentityServer4 作为 Web API

Xamarin.Auth 或 IdentityModel + IdentityServer4

如何使用 IdentityServer4 访问令牌和 [Authorize] 属性