2016-08-16 91 views
0

我有一个ASP.NET 3.5应用程序,我最近使用多个成员资格和角色提供程序进行扩展,以在该应用程序中“附加”第二个应用程序。我无法直接访问IIS配置,因此我无法将其分解到单独的应用程序目录中。ASP.NET 3.5多角色提供程序

这就是说,我已成功分离登录;然而,在我登录后,我可以通过自定义角色例程验证用户所属的组,并且我可以为两个“应用程序”使用不同密码的相同用户名。

我遇到的问题是,当我使用与其他成员身份相同的用户名(它在目录上使用web.config角色)创建用户时,我可以手动将URL切换到其他应用程序,并且它拿起用户名,并加载该应用程序的角色。很明显,这是不好的,因为它允许用户创建一个有权访问其他应用程序的用户名,并与其他用户的角色交叉到另一个应用程序中。

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

我意识到情况并不理想,但这些都是目前强加的限制。

示例性认证(在验证):

FormsAuthentication.SetAuthCookie(usr.UserName, false); 

此cookie需要被基于用户令牌我怀疑的,而不是用户名,以便将两个提供分开?那可能吗?

回答

0

也许不是问题的答案我更愿意去,但我可以通过使一个应用程序中使用的用户名的身份验证cookie来的两个人分开,而其他使用ProviderUserKey(GUID) 。这样auth cookie不会被从一个“应用程序”识别到另一个。

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

这需要我奇怪地处理事情了一点,但它只是来到了增加了一些扩展方法,以及处理通过我自己班上的成员公用事业(我是做无论如何)。

ex。扩展方法:

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

凡MNMember是一个静态类,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目录安全性,这意味着应该能够移除主页面的破解。 (理论上?)

编辑2:不 - asp.net使用username auth cookie来解析web.config中指定的角色。