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 中指定的角色。
我有一个 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 中指定的角色。