ASP.NET成员资格/角色 - 如何将用户链接到多个应用程序/角色?

时间:2012-01-04 16:00:03

标签: asp.net asp.net-membership asp.net-roles

我正在开展一个项目,将大型网站拆分为更小,更具体的网站。我需要能够将对这些站点的访问限制为仅具有必要权限的用户,并且希望尽可能使用现有的成员资格/角色数据模型。

理想情况下,我希望将潜在的多个应用程序(在aspnet_applications表中定义)和特定于应用程序的角色(aspnet_roles)分配给单个用户。但是,aspnet成员资格模型似乎不允许这样做,因为aspnet_users和aspnet_membership记录包含特定的applicationID。

如何将单个用户分配给多个应用程序/角色?

3 个答案:

答案 0 :(得分:2)

我已经使用了我的sql成员资格提供程序,我认为它在设计方面与sql提供程序没有什么不同。

为了将同一个用户与不同的角色联系起来,应该有一个名为 asp_net_usersinroles 的表格。在该表中,您可以插入具有不同roleID的相同userID,以便允许用户拥有多个角色。

同样,您需要创建UI以允许管理员用户分配不同的角色。在我的例子中,我使用ListBox来显示应用程序中的现有角色,这允许多重选择。

希望这有帮助。

答案 1 :(得分:2)

如果您不希望将数据链接到一个应用程序,那么除了标准的SqlMembership提供程序之外,您还可以考虑使用自定义management/role提供程序。

它具有更大的数据源使用灵活性,例如,您可以在数据库中使用自己的表来存储成员/角色信息,并在多个应用程序中使用这些表等。

您甚至可以更进一步,例如,您可以实现自定义成员资格和角色提供程序,并创建单独的模块(程序集),然后在多个应用程序中重用该模块。

答案 2 :(得分:0)

您可以在代码中设置成员资格检查的ApplicationName。

我有一个管理应用程序,可以控制一系列其他应用程序的所有内容。我希望该应用程序中的用户能够登录到所有其他应用程序,因此如果默认应用程序中的用户登录失败,我会检查“管理”应用程序。这就是我对登录部分的看法。请注意“Membership.ApplicationName =”Administration“;”

if (Membership.ValidateUser(model.UserName, model.Password))
{
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}
else
{
    Membership.ApplicationName = "Administration";
    if (Membership.ValidateUser(model.UserName, model.Password))
    {
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && retu    rnUrl.StartsWith("/")
            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }
    else
    {
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
}