ASP.NET 3.5 多角色提供者

ASP.NET 3.5 Multiple Role Providers

我有一个 ASP.NET 3.5 应用程序,我最近将其与多个成员资格和角色提供者一起扩展到 "attach" 此应用程序中的第二个应用程序。我没有直接访问 IIS 配置的权限,所以我不能将它分解到一个单独的应用程序目录中。

也就是说,我已经成功分离了登录;但是,在我登录后,我能够通过自定义角色例程验证用户所属的组,并且我能够为 "applications."

使用不同密码的相同用户名

我 运行 遇到的问题是,当我创建一个用户名与其他成员(在目录上使用 web.config 角色)相同的用户名时,我可以手动切换 URL到另一个应用程序,它会获取用户名,并加载该应用程序的角色。显然,这很糟糕,因为它允许用户创建有权访问其他应用程序的用户的用户名,并以其他用户的角色进入其他应用程序。

我该如何缓解这种情况?如果我只能使用一个应用程序,与多个角色和成员提供者一起工作,并且 auth cookie 存储显然可以转移的用户名,我能做些什么吗?

我知道情况并不理想,但这些是目前强加的限制。

示例身份验证(验证后):

FormsAuthentication.SetAuthCookie(usr.UserName, false);

此 cookie 需要基于我怀疑的用户令牌,而不是 UserName 才能将两个提供商分开?这可能吗?

您是否尝试过在您的成员资格连接字符串中指定 applicationName 属性?

https://msdn.microsoft.com/en-us/library/6e9y4s5t.aspx?f=255&MSPPError=-2147217396

也许这不是我想要的答案,但我能够通过让一个应用程序使用用户名作为 auth cookie 而另一个应用程序使用 ProviderUserKey (guid) 来将两者分开。这样 auth cookie 就不会被从一个 "application" 识别到另一个

FormsAuthentication.SetAuthCookie(user.ProviderUserKey.ToString(), false);

这需要我处理一些奇怪的事情,但归根结底是添加一些扩展方法,并通过我自己的 class 处理大量成员实用程序(无论如何我都在做)。

例如。扩展方法:

public static string GetUserName(this IPrincipal ip)
{
    return MNMember.MNMembership.GetUser(new Guid(ip.Identity.Name), false).UserName;
}

其中 MNMember 是静态的 class,MNMembership 返回二级会员提供者,GetUser 是会员提供者的标准函数。

var validRoles = new List<string>() { "MNExpired", "MNAdmins", "MNUsers" };
            var isValidRole = validRoles.Intersect(uroles).Any();
            if (isValidRole)
            {
                var userIsAdmin = uroles.Contains("MNAdmins");
                if (isAdmin && !userIsAdmin)
                {
                    Response.Redirect("/MNLogin.aspx");
                }
                else if (!userIsAdmin && !uroles.Contains("MNUsers"))
                {
                    Response.Redirect("/MNLogin.aspx");
                }...

isAdmin 正在检查路径中是否显示子目录。

看起来很老套,但似乎也行得通。

编辑:既然我没有使用用户名作为令牌,我应该能够返回使用 web.config 来确保目录安全,这意味着母版页 hack 应该能够删除。 (理论上?)

编辑 2:Nope - asp.net 使用用户名身份验证 cookie 来解析 web.config 中指定的角色。