多个网站,单点登录设计

Yan*_*nis 10 c# asp.net-mvc forms-authentication single-sign-on

我有个问题.我最近做过一些工作的客户有一系列具有不同登录机制的网站.他希望慢慢迁移到他的网站的单一登录机制(所有写入asp.net mvc).

我在这里查看我的选项,所以这里是一个要求列表:

  1. 它必须是安全的(duh)
  2. 它需要支持超出通常名称,地址内容(例如用户的金钱或信用)的额外用户属性
  3. 为了方便起见,它必须提供一个集中的用户管理Web控制台(我知道这将是一个小项目,除了我选择的任何设计解决方案)
  4. 它必须与现有网站集成,而无需重新设计整个产品(我知道这取决于当前的产品实现).
  5. 它必须处理用户注册时的电子邮件(以便他激活他的帐户)
  6. 当他点击电子邮件中的激活我链接时,它必须处理激活用户(我知道5和6需要某种形式的电子邮件模板系统来支持每个应用程序的不同电子邮件)

我正在考虑创建一个与表单身份验证一起工作的库,它可以公开所需的任何方法(例如登录,注销,激活等)以及通过电子邮件,注册处理等实现激活的小型宁静服务.

考虑到已经遗漏了许多东西以使这个问题简短而重要,这听起来像是一个好的设计吗?

但这看起来是一个非常普遍的问题,所以我可以使用任何现有的项目吗?

谢谢阅读.

Pau*_*oza 3

需要认识到的基本一点是,您无法跨多个域使用标准表单身份验证来对用户进行身份验证。例如,dev.google.com 和 www.google.com 是不同的域,如果用户登录 dev.google.com,他不会自动登录 www.google.com,除非 Google 采取特殊措施来启用此功能。这是因为浏览器无法访问其他网站的cookie。

真正使跨域登录发挥作用的唯一方法是在 URL 的查询字符串中包含一个键值(例如会话 ID),网站会检查该值并设置用户的身份验证 cookie。您可以使用少量您自己的自定义代码通过您的网站手动执行此操作。

示例:http://www.example.com/autoLogin.aspx? sessionid=23232323

但这种方法的危险在于,有人可能通过找出用户使用的地址并检查会话 ID 来欺骗用户会话。因此,您需要确保用于跨域验证用户身份的值是时间敏感且动态的。不要将其设为用户的用户 ID 或用户名或类似内容。

现在,如果这些站点位于同一域中,您可以为它们提供相同的 MachineKey,然后当用户在同一域中的不同网站之间移动时,已经登录到一个站点的用户将不会被注销。