MVC6 Identity3 - 如何为多个 WebApps 创建通用用户帐户

MVC6 Identity3 - How to create common User Accounts for multiple WebApps

我是 MVC 的新手,目前正在使用 MVC6(EF7、Identity3、VS2015)...

我想在一个公司域(在不同的子域)中创建两个 different/independent WebApps。

我想为两个应用程序使用 common/shared identity/login 系统 - 换句话说,我允许用户在两​​个应用程序中拥有一个帐户。

我没有域身份验证选项(公司不使用该域 - 我知道这很奇怪),所以我必须这样做吗?使用个人用户帐户...

什么是最好的 way/practice 在多个应用程序中创建和使用通用用户帐户?

首先,我考虑在两个应用程序中创建两个不同的 DBContext:一个用于身份(用户数据库),第二个用于与应用程序相关的数据库...

这种方法会给我三个不同的数据库:

但是我怀疑这是否是好的做法和最好的方法?

配置正确的 DBContext 可能就足够了,但我不知道应该从哪里开始。

我已经阅读了有关 SSO(单点登录)的信息 - 但据我了解它是关于身份验证过程的,所以它有点晚了 - 所以我不确定这个方向。

无论如何都找不到如何跨多个应用程序创建普通用户的示例 account/profile。


更新:

我原来的问题可能太开放了...我不仅要问'what to do'还要问'how to do in MVC6'...

所以我的附加问题是:如何在 MVC6 中实现这一点?我必须做什么?也许有一些例子?

如果我决定使用一个单独的用户数据库 - 那么从应用程序的角度来看,我将有两个数据库吗?在代码中如何处理这个?我应该创建两个单独的 DBContext 还是只创建一个?

此外,我在这里阅读了一些关于 SO 的意见,即仅使用一个 DbContext 是更好更简单的选择...

无论如何,我昨天尝试使用 2x DBContext - 当我为 IdentityDbContext 创建新控制器时一切正常,但是当我尝试为第二个 DBContext(与身份无关)创建任何控制器时出现错误...

(我已将此错误的描述放到新问题中:MVC6 Working with two DBContexts and error when create new controller


提前感谢您的任何建议:)

在 ASP.NET 之前的版本中,Identity (2) 跨子域共享身份 cookie 是一种解决方案。我不确定版本 3,但你可以测试一下:

StartupConfigure 方法中更改身份配置 class:

services.AddIdentity<ApplicationUser, IdentityRole>(config =>
    {
        config.Cookies.ApplicationCookie.CookieDomain = ".domain.com";
    })
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

如果拥有三个数据库是最佳方式,您的问题的答案是:视情况而定。

这是否是一种良好做法的答案无关紧要。

让我详细说明。

每个应用程序都有其专用数据库的概念源于老式思维。大型企业架构由各种持久性存储组成,每一个都选择做它最擅长的事情。所以它与良好实践无关。您应该将数据存储在最适合的位置。尤其是领域驱动设计和限界上下文,可以更好地理解我在说什么。

所以问题是如果您需要三个数据库,如果在您的特定情况下这是最佳选择,那么这就是您应该做的。为了使这个答案完整,我将描述我们的情况。我们有一个包含用户的旧用户数据库。在逐步淘汰所有网络应用程序之前,我们无法摆脱它。尽量减少它对我们客户的影响。因此,对于我们的新 Web 应用程序,我们只为用户使用这个旧数据库,而将 Azure 存储用于我们需要存储的所有其他内容。换句话说,从概念上讲,我们的情况就像您描述的那样。所有其他 Web 应用程序使用的用户的单独存储。

听起来是解决问题的好方法?

更新 至于 MVC6,Identity Server 3 特定。 ID 服务器 3 能够使用自定义用户服务,它允许您连接任何您想要的用户存储。以下是详细信息:https://identityserver.github.io/Documentation/docs/advanced/userService.html。这正是我们所做的。

关于你的其他问题;我们可能会将用户放在 Azure Table 存储中,并在所有旧应用程序都消失后通过 IdentityServer4 从那里检索它。现在,遗留 MySQL 数据库中只剩下我们的用户。但是有一些旧的应用程序仍在使用它,所以...

这是否回答了您的问题?