我有一个基于 ASP.Net 的系统;网站的相同副本在三台不同的服务器上运行,所有服务器都是运行 IIS7.5 的 Windows 2008R2。每个网站都有自己的身份验证数据库,有自己的用户、角色、配置文件等。
我想将这些数据库合并在一起,以便三个服务器共享一个身份验证数据库,然后用户可以登录到这三个服务器中的任何一个。
主站点拥有迄今为止最大的用户群;其他两个站点每个只有少量用户/个人资料,因此必要时可以手动重新创建它们。但是,我需要做什么才能确保密码哈希/盐在每个服务器上都有效且可用?
MachineKey
这只是在 中设置一致 的情况吗web.config
?我还需要ApplicationId
在aspnet_Applications
表中设置一致吗?
答案1
如果将较小的两个会员表合并到较大的表中,则在将会员表迁移到较大的表中时,您可以将新行的 ApplicationID 更改为与第一个相同的 ApplicationID。 这样做之后,您将有效地拥有 1 个更大的用户应用程序,由 3 个应用程序共享。 由于您正在使用哈希(我假设您的 web.config 具有 validation=SHA1),因此您不必担心机器密钥,因为它不用于验证登录 - 这是盐的用途。 机器密钥用于加密会话、表单数据和 ViewState 等内容。 如果每个应用程序的机器密钥保持不同,则没问题。 (如果您在多台服务器之间对单个应用程序进行负载平衡,则需要它们相同。)
现在说一些注意事项。
- 用户名在会员数据库中必须是唯一的,因此如果 3 个应用程序中有重复的用户名,则必须根据具体情况确定如何处理。如果有重复的用户名,则希望他们是同一个人在两个应用程序上重复使用用户名,但情况不一定如此。(两个不同的用户可能在不同的应用程序上使用用户名“Ken”,在这种情况下,其中一个用户必须选择一个新的用户名。)如果是同一个用户,他们可能有不同的密码或电子邮件,因此其中一个用户必须胜出。
- 同一用户可能在不同的应用上拥有两个不同的帐户。您可能只想使用其中一个。
- 电子邮件也可能被配置成唯一的,如果是这样,您将遇到类似的问题,即不同的用户名拥有相同的电子邮件。但这实际上可能对您有所帮助,因为如果同一个用户有两个不同的帐户,这将更容易隔离。
- 角色将具有不同的 RoleID,需要合并,并且 UsersInRoles 条目也需要相应地更新。
- 如果您使用的是 aspnet_Profile 表,并且某些用户在多个应用程序中拥有帐户,则必须弄清楚如何合并数据。这实际上适用于所有表,但对于大多数其他表,您可能只会从更受欢迎的应用程序中选择一个字段(上次登录日期、IsUserLockedOut 等)。但是对于配置文件数据,必须合并它,因为它包含多个名称/值对。
- 这应该是不言而喻的,但您将需要进行一些相当广泛的测试。我的警告列表绝不是详尽无遗的;而且这显然可能会对自定义应用程序代码造成重大影响。