ASP.NET MVC 5 - 多个项目,单一身份验证 - SSO

时间:2015-01-28 16:30:11

标签: asp.net-mvc single-sign-on asp.net-identity thinktecture-ident-server

背景信息 我们开发了3个独立的ASP.NET应用程序,现在也作为套件出售。客户可以订购1,2或所有应用程序。

作为独立应用程序,这给我们带来了挑战,我们并不完全确定如何解决它:身份验证。应用程序都有自己的Indentity实现,这会强制客户创建每个用户帐户3次,并且用户需要为每个应用程序单独登录。因此,客户端请求实施SSO。

问题: 我们已经对SSO做了一些研究,Thinktecture IdentityServer看起来非常好,能够解决我们的问题。但是,用户连接到应用程序中的某些实体。我们遇到了一些问题:

  • 如何确保IdentityServer与三个客户端应用程序之间的一致性(或外键)?
  • 用户需要在应用程序创建时立即可用(用户需要能够选择其他用户,即使他们尚未登录)。在身份服务器中创建用户时,我们如何确保在应用程序中创建用户?

可能我们完全走错了路 - 有没有其他解决方案可以解决我们面临的问题?非常感谢提前..

2 个答案:

答案 0 :(得分:1)

首先,请记住,vs2013网页模板中有OWIN Authorization server,如果您愿意,可以将其拆分为独立服务器。换句话说,Thinktecture服务器并不是您唯一的选择,尽管它更强大且功能更全。

为了解决您手头的问题,我想到了几个选项:

  1. 将用户管理分解为单独的数据库和单独的DbContext。如果将代码编写为类库,则可以在单个集中式数据库中管理所有用户,并重用DbContext和派生的IdentityUser类。这是处理这种情况的更简单,更快速,更简单的方法。
  2. 创建用于创建用户的安全Web API并将其包含在所有3个站点中。对Identity UserManager进行子类化并调用其他两个站点,首先在其他站点上创建用户,然后在当前站点上创建用户。如果在任何网站上出现故障,请不要创建用户并在创建用户的任何网站上回滚。此选项需要比第一个选项多得多的工作,因为您必须保持同步,但如果由于某种原因您不能使用单个数据库进行用户管理,这将有效。

答案 1 :(得分:0)

你需要关闭一个DBA并以不同的方式看待事物。外键仅在关系数据库中可用,即使数据库位于同一服务器上,您也无法始终链接到其他数据库中的实体。

所以放开“外键”要求,只需使用用户名或UserIds(可能是GUID)将域对象与用户关联起来。

至于第二个要求 - 我不确定问题是什么。如果您说您需要为尚不存在的用户创建域实体,那么无论如何您都被搞砸了 - 您无法使用不存在的东西。简单的答案是首先在Identity Server中创建Users,然后为该用户创建域实体。然后,您可以更改用户属性并为真人提供用户名/密码以供使用。