我想在.NET Core中设置多租户。基本思路是:
任何使用第三方提供商(Azure AD,Google等)登录的用户都需要首次“注册”。然后,他们的Google帐户将与用户帐户相关联。 JWT令牌也将映射到具有特定权限的用户帐户。
我的初衷是尝试做这样的事情:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme =cookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddGoogle(optoins => Configuration.Bind("Google", options))
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
现在的问题是,我现在有多个challenenge和身份验证方案,所以我的计划是删除默认方案,并为用户提供一种选择他们想要使用的方案的方法。
我所做的是子类AuthenticationService
并覆盖AuthenticateAsync
,ChallengeAsync
和SignInAsync
。 Authenticate和Challenege将重定向到用户将选择其身份验证首选项的页面。然后将他们的选择存储在cookie中,并用于后续调用Authenticate和Challenege。到目前为止,情况正在发生,除非现在SignInAsync
运行时没有注册的处理程序。
在这个阶段,我想知道我解决问题的方法是否正确:看起来创业公司应该注册我需要的处理程序。我确信有一种方法可以根据用户的选择注册处理程序,但我想知道这是否正确。
答案 0 :(得分:0)
通过阅读Microsoft的身份文档后,似乎为了让他们的示例按照书面形式工作,需要使用身份。对AddIdentity
和AddDefaultTokenProviders
的调用配置默认以下代码将根据我的要求或多或少执行(除了JWT)
//configure identity
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
//configure other providers
var authSection = Configuration.GetSection("Authentication");
var authBuilder=services.AddAuthentication()
.AddGoogle(options => authSection.Bind("GooglePlus", options))
.AddAzureAd(options => authSection.Bind("AzureAd", options));
以下是文档的说法:
注意:对AddIdentity
的调用会配置默认方案设置。 AddAuthentication(string defaultScheme)
重载设置DefaultScheme
属性;并且,AddAuthentication(Action<AuthenticationOptions> configureOptions)
重载仅设置您明确设置的属性。添加多个身份验证提供程序时,只应调用一次这些重载。对它的后续调用可能会覆盖以前配置的任何AuthenticationOptions
属性。