3

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

我想在一个公司域(在不同的子域中)创建两个不同/独立的 WebApp。

我想为这两个应用程序使用通用/共享身份/登录系统 - 换句话说,我将允许用户在两​​个应用程序中拥有一个帐户。

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

在多个应用程序中创建和使用通用用户帐户的最佳方式/做法是什么?

首先,我考虑在两个 App 中创建两个不同的 DBContext:一个用于身份(用户 DB),第二个用于 App-Related Db ...

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

  • IdentityDb - 两个 WebApp 通用,
  • 应用程序数据库
  • App2Db

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

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

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

无论如何都找不到如何跨多个应用程序创建通用用户帐户/配置文件的示例。


更新:

我最初的问题可能太开放了......我不仅想问“做什么”,还想问“如何在 MVC6 中做”......

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

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

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

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

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


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

4

2 回答 2

1

如果拥有三个数据库是最好的方法,那么您的问题的答案是:这取决于。

这是否是一个好习惯的答案是无关紧要的。

让我详细说明。

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

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

对您来说,这听起来像是解决问题的好方法?

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

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

这能回答你的问题吗?

于 2016-04-04T07:44:32.413 回答
1

在以前版本的 ASP.NET Identity (2) 中,跨子域共享身份 cookie 是一个问题。我不确定版本 3,但您可以对其进行测试:

Configure在类的方法中更改身份配置Startup

services.AddIdentity<ApplicationUser, IdentityRole>(config =>
    {
        config.Cookies.ApplicationCookie.CookieDomain = ".domain.com";
    })
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
于 2016-04-03T04:49:19.160 回答