我们有一个Account-API,负责创建JWT令牌,然后将其用于不同的API上以对用户进行身份验证。我们之所以选择Account-API方法,是因为这样我们可以在一个API中集中管理帐户,创建令牌等,而其他API只信任令牌,这样就可以使一切保持良好的组织和无状态。
现在的问题是,我们已经在不同的DBContext中实现了AdminUsers和Customer,以在数据库中“物理地”将这些登录名彼此分开。
我们在Startup.cs中对AddIdentity的调用:
services.AddIdentity<CustomerUser, CustomerRole>()
.AddEntityFrameworkStores<CustomerContext>();
services.AddIdentity<AdminUser, AdminRole>
.AddEntityFrameworkStores<AdminContext>();
现在,当我们添加身份验证中间件UseAuthentication()
时,我在启动时遇到了一个异常:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll: 'Scheme already exists: Identity.Application'
at Microsoft.AspNetCore.Authentication.AuthenticationOptions.AddScheme(String name, Action`1 configureBuilder)
at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.<>c__DisplayClass4_0`2.<AddSchemeHelper>b__0(AuthenticationOptions o)
at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
[...]
由于仅在添加UseAuthentication
之后才抛出此异常,所以我认为在幕后为每个发现的身份添加Authentication-Scheme会带来一些魔术,从而导致此异常。
这里的问题:我们正在使用IdentityServer4进行令牌创建,并准备使用OAuth2.0。 IdentityServer4代表我们呼叫UseAuthentication
。而且我们实际上需要AccountAPI中的身份验证,因为我们为用户提供了一个/me
端点来检索他们的个人资料(但在这里ID令牌可能是更好的方法?)
在这种情况下我们可以做些什么?是否可能在一个应用程序中真正分离了帐户和身份,还是必须将其拆分为两个应用程序?还是创建我们自己的身份验证中间件(确定哪个用户ID被封装在JWT中)?