使用ASP.Net Membership,能否使用多个Membership提供程序登录同一个网站?

3

情况是这样的:

我们有19个站点,目前配置为使用不同的应用程序名称共享单个ASP成员数据库,例如:

<membership defaultProvider="Site1Membership">
  <providers>
    <add
      applicationName="/site1"
      name="Site1Membership" />
    <add
      applicationName="/site2"
      name="Site2Membership" />
  </providers>
</membership>

我的问题是,如果在web.config中定义了多个提供程序,用户是否可以通过非默认提供程序进行登录?

在给定的配置中,显然存储在具有应用程序名称“/ site1”的默认提供程序中的用户将能够登录,但是我们希望存储在具有应用程序名称“/ site2”的仓库中的用户也能够登录。

我们尝试在登录时使用提供程序名称和应用程序名称作为用户名前缀,例如:

site2:username或site2Membership:username

但是似乎都不起作用。

最终目标是,尽管我们希望这19个站点具有单独的用户和安全性(即站点1的用户无法登录到站点2),但我们希望有第20个站点,所有站点的用户都可以登录并协作,而无需第二个用户名/密码。

1个回答

4

虽然可以实现这一功能,但您需要编写一些自定义代码。简单来说,您需要确定所提供的登录属于哪个用户组:一个应用程序特定的用户组或一个“全局”用户组。我通过要求全局用户将其登录名前缀添加为“G \”或“MyCompany \”来处理此问题,而普通用户则不需要这样做。

身份验证方面实际上很容易。在登录按钮的Click事件或LoginControl的OnAuthenticate方法中,您只需要检测用户并将其与正确的成员资格提供程序名称匹配即可。

MembershipProvider provider;
if ( username.Text.StartsWith("G\") then
    provider = Membership.Providers["GlobalProvider"];
else
    provider = Membership.Providers["StandardProvider"];

if ( provider.ValidateUser( ... 

涉及到的复杂性在于角色。SqlRoleProvider并不适用于处理多个应用程序使用相同用户存储的情况。您必须修改SqlRoleProvider使用的过程,以便它将遵守MembershipProvider的应用程序,而不是其默认性质,即仅使用RoleProvider的应用程序。此外,您需要确保全局用户在登录时自动添加到某个角色。


我们本来希望避免编写代码或自定义提供程序,但看起来这是唯一的答案。 :( - Ragoczy

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