处理具有多种用户类型的系统的最佳方法是什么?

时间:2011-11-23 12:32:21

标签: c# asp.net-mvc-3 roles user-management

我被赋予了将asp系统更新为MVC3的任务。我的主要问题是当前系统有2种不同的用户,每个用户都有自己的用户表,而在当前的asp站点中,每个用户都由多个不同的会话持有变量定义。

因为其他系统使用两个不同的用户表,所以我无法合并它们。那么最好的前进方式是什么?

我最初想过将它们分开保存在系统中;拥有每个用户的类类型,其中包含从其asp对应方镜像的单独变量。登录时,我可以将用户类型推送到auth cookie中的userdata,然后在IPrincipal上创建一个扩展方法,以便在需要时返回用户类型。

这感觉有些黑客,而且由于用户将查看相同的页面,因此会出现大量重复的代码。

在用户存储库之前创建某种形式的外观是否会更好,这会将角色附加到一个公共用户对象,这将识别系统中的用户类型?然后我可以检查这个角色,并在需要时提取以前存储在会话变量中的数据。

4 个答案:

答案 0 :(得分:0)

如果我有机会这样做,我会按照以下方式进行:

  1. 实施asp.net会员提供商并将所有用户导入其中。
  2. 为用户类型创建两个不同的角色
  3. 使用配置文件提供程序存储用户类型表中的其他属性。
  4. 这样,您可以使用角色和配置文件的组合来处理与授权和限制相关的任何情况。

答案 1 :(得分:0)

我将使用两个用户共有的方法定义一个接口,并让两个用户类型都实现该接口。所以,如果你有类似的东西:

interface IUser { bool CanViewPage1(); }
class UserType1 : IUser { }
class UserType2 : IUser { }

Session["user"] = new UserType1();

然后你可以这样做:

var user = (IUser)Session["user"];

对于常见操作:

if (user.CanViewPage1())
{ 
   ...
}

以及需要用户对象的操作:

bool CanViewPage2(IUser user)
{
   if(user is UserType1)
   {
       var ut1 = (UserType1)user;
       ...
   } else if (user is UserType2)
   {
       var ut2 = (UserType2)user;
       ...
   }
}

最后一部分也可以通过扩展方法完成,如你所说。

答案 2 :(得分:0)

我建议将WIF与自定义简单STS服务器一起使用,并对用户类型使用声明。 http://msdn.microsoft.com/en-us/library/ee748475.aspx

为了检查这些东西 - 使用自定义属性,或简单 - Identity.HasClaim(“someclaim name or type”)。

此外,这将标准化您的身份验证/授权方法,以后可以节省一些时间=)

答案 3 :(得分:0)

如果我是从头开始构建此应用程序,我会根据角色区分用户类型。考虑到这一点,我在“用户”构建器和代表之间创建了一个反腐败类。这会注入/删除角色(id为0)以区分用户类型。将来,客户希望合并表格,所以这似乎是目前最合理的方式。