Object 如何使用MS角色设计用户对象模型&;会员

Object 如何使用MS角色设计用户对象模型&;会员,object,model,asp.net-membership,Object,Model,Asp.net Membership,我想为一个典型的web应用程序建立一个“用户”对象模型……但是我不能决定如何最好地设计对象模型和角色系统 基本上,我计划有大约4种用户类型…它们将对应于成员资格提供者中的用户“角色” 这些类型将是: •工人 •雇主 •客人 •管理 超级类型是: •用户 此外,用户有时可能既是“工人”又是“雇主” 我想使用MS角色和成员资格提供程序,并将导航UI设置为响应用户角色 我的问题是: 我如何最好地设计这些用户,使其具有灵活性(用户可以是工人和雇主)。 如何处理登录/角色过程 (我想到的是一个用户,他有一

我想为一个典型的web应用程序建立一个“用户”对象模型……但是我不能决定如何最好地设计对象模型和角色系统

基本上,我计划有大约4种用户类型…它们将对应于成员资格提供者中的用户“角色”

这些类型将是: •工人 •雇主 •客人 •管理

超级类型是: •用户

此外,用户有时可能既是“工人”又是“雇主”

我想使用MS角色和成员资格提供程序,并将导航UI设置为响应用户角色

我的问题是: 我如何最好地设计这些用户,使其具有灵活性(用户可以是工人和雇主)。 如何处理登录/角色过程

(我想到的是一个用户,他有一个“行为”对象的工厂(工人行为、雇主行为))

对于登录用户,在…中登录将查找其角色并强制转换为其子类型


应该这样做吗?

仅仅使用角色本身的概念对我来说已经足够了。它没有提供足够低的粒度来控制权限。例如,您可能有一个worker角色和一个admin角色,然后在代码中使用principal.IsInRole(“admin”)来检查他们的角色,以确定他们是否可以修改某些值(例如salary)。然后有人改变了主意,说主管可以改变工资,但仍然不是管理员。现在,您必须更改您的访问检查以添加另一个角色检查。痛苦和常规

因此,我要做的是列出应用程序中的所有功能,然后允许它们与数据库中的所有角色关联。我的访问检查看起来像principal.HasPermission(“CHANGESALARY”)。我根据用户登录时附加到的角色加载用户权限。通过这种方式,企业可以创建任意数量的功能组并命名它们。然后,它们可以应用于任何用户

我创建一个自定义主体对象并将其附加到线程,以便在整个页面生命周期的任何代码中使用它。此对象具有从数据库加载权限的代码和检查权限的方法


我通常发现框架中的“提供者”适用于一小类应用程序,并且不能满足大多数需求。当你按照自己的意愿去做的时候,从头开始写就更容易了。

老实说,这可能不是一个很好的解决方案,但它可能有助于产生一些其他想法

我的角色是所有可能的权限组合:

Worker, Employee, Guest, Admin, WorkerEmployee, etc
public enum AvailableRoles
{
    None = 0,
    Guest = RolePermissions.Guest, //1
    Worker = RolePermissions.Worker, // 2
    Employee = RolePermissions.Employee, // 4
    WorkerEmployee = RolePermissions.Worker | RolePermissions.Employee, // 6
    Admin = RolePermissions.Admin, // 8
}
在我的代码中,我有个人权限的枚举

[Flags]
public enum RolePermissions
{
    Guest = 1,
    Worker = 2,
    Employee = 4,
    Admin = 8
}
我有一个对应于数据库中角色的枚举。整数值是权限的按位或:

Worker, Employee, Guest, Admin, WorkerEmployee, etc
public enum AvailableRoles
{
    None = 0,
    Guest = RolePermissions.Guest, //1
    Worker = RolePermissions.Worker, // 2
    Employee = RolePermissions.Employee, // 4
    WorkerEmployee = RolePermissions.Worker | RolePermissions.Employee, // 6
    Admin = RolePermissions.Admin, // 8
}
然后,我可以使用一组方法来查找权限等:

// Used to determine if the currently logged in user has a particular permission (Guest, Worker, Employee, Admin)
public static bool UserHasPermission( RolePermissions rolePermssion )
{
    foreach( string role in Roles.GetRolesForUser() )
    {
        AvailableRoles availableRole = Parse( role );

        if( ( (RolePermissions)availableRole & rolePermssion ) == rolePermssion )
            return true;
    }

    return false;
}

// Used to determine whether the currently logged in user is in a specific role
public static bool UserIsInRole( AvailableRoles requestedRole )
{
    return UserIsInRole( Membership.GetUser().UserName, requestedRole );
}

// Used to determine whether a specific user is in a specific role
public static bool UserIsInRole( string username, AvailableRoles requestedRole )
{
    foreach( string role in Roles.GetRolesForUser( username ) )
    {
        AvailableRoles actualRole = Parse( role );

        if( actualRole == requestedRole )
            return true;
    }

    return false;
}

// Helper method to parse enum
private static AvailableRoles Parse( string role )
{
    return (AvailableRoles)Enum.Parse( typeof( AvailableRoles ), role );
}
如果您提出了更好的方法或进行了改进,请让我知道,以便我可以将其合并回我自己的代码中。:-)