多个网站,单一登录设计

10
我有一个问题。我的客户最近做了一些工作,他拥有一系列具有不同登录机制的网站。他正在逐步迁移到一个单一的“单点登录”(single sign-on)机制用于他的网站(都是使用asp.net mvc编写的)。
我在这里考虑我的选择,以下是要求列表:
  1. 必须安全(当然)
  2. 需要支持超出常规名称、地址等信息之外的额外用户属性(例如用户的货币或信用)
  3. 必须为他提供集中式用户管理Web控制台,以方便他(我知道这将是在我选择的任何设计解决方案之上的一个小项目)
  4. 必须与现有的网站集成,而不需要重新设计整个产品(我知道这取决于当前产品的实现)。
  5. 注册时它必须向用户发送电子邮件(以便他激活他的账户)
  6. 当用户点击电子邮件中的激活链接时,它必须激活用户(我知道5和6需要某种形式的电子邮件模板系统,以支持每个应用程序的不同电子邮件)
我考虑创建一个库,与表单身份验证一起工作,公开所需的任何方法(如登录、注销、激活等),以及用于实现来自电子邮件的激活、注册处理等的小型RESTful服务。
考虑到为了简洁和重点而省略了许多事情,这听起来像一个好的设计吗?
但这看起来是一个非常常见的问题,难道没有任何现有的项目可以使用吗?
谢谢阅读。
2个回答

3
基本的事情是,您无法使用标准的表单身份验证在多个域中对用户进行身份验证。例如,dev.google.com和www.google.com是不同的域,如果用户登录dev.google.com,则除非Google采取特殊措施启用此功能,否则他不会自动登录www.google.com。这是因为浏览器无法访问另一个网站的cookie。
实现跨域登录的唯一方法是在URL查询字符串中包含一个键值,例如会话ID,该网站检查并设置用户的身份验证cookie。您可以通过使用自己的自定义代码手动完成此操作。
示例:http://www.example.com/autoLogin.aspx?sessionid=23232323 但是,这种方法的危险在于某人可能会通过找到用户使用的地址并检查会话ID来欺骗用户会话。因此,您需要确保用于跨域身份验证的值是时间敏感和动态的。不要将其设置为用户的用户ID或用户名等内容。
现在,如果站点位于同一域上,则可以为它们提供相同的MachineKey,然后已经登录到一个站点的用户在同一域上移动到不同的网站时不会被注销。

我们通过GUID实现了这一点,数据库有一个“autologin”表,过期时间为3分钟。这是在假设所有站点都可以访问单个共享数据库的情况下进行的。 - dvallejo
我使用了这种方法作为灵感,并创建了一个单点登录服务,使用令牌来确保请求没有被篡改。它不需要机器密钥,因为用户在登录服务中被转发(实际术语或透明地),并在成功验证后返回到接收加密令牌的返回URL,然后要求登录服务对其进行解密。如果成功,则用户信息存储在会话中(或使用的任何存储机制中的cookie等)。 - Yannis

2

我知道ASP.Net Membership Provider,但它对我提到的场景是否灵活?例如,它如何将电子邮件发送委托给底层Web应用程序进行确认等操作?谢谢。 - Yannis
电子邮件功能必须建立在提供程序之上。例如,http://www.c-sharpcorner.com/uploadfile/raj1979/passwordrecovery10032008150514pm/passwordrecovery.aspx 上有一个ASP.Net密码恢复控件,可以进行电子邮件发送。 - Mikael Svenson
Mikael,你有使用OpenID完成这种操作的示例吗?目前我的主要问题是缺乏文档,这迫使我创建自己的解决方案并完成它... - Yannis
关于OpenID和MVC - SO - https://dev59.com/dHRB5IYBdhLWcg3wv5o_,你可能需要编写一些控制器以满足所有要求。或者搜索已经存在的控制器。 - Mikael Svenson
我相信当前版本的NerdDinner同时使用了OpenID和Google ID。 - dvallejo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接