具有不同功能的用户

时间:2013-08-17 08:34:56

标签: asp.net asp.net-mvc asp.net-mvc-scaffolding asp.net-mvc-5

我正在创建一个ASP.Net MVC 5应用程序。在我的网站中,存在3种不同类型的用户。

  • 管理
  • 普通用户
  • 餐馆

这些用户中的每一个都有自己的功能和访问权限。意思是,每个人的观点都应该不同。

我已经为普通和餐厅创建了模型。我想知道如何修改现有结构以支持此功能。

public class User : IUser
{
    public User()
        : this(String.Empty)
    {
    }

    public User(string userName)
    {
        UserName = userName;
        Id = Guid.NewGuid().ToString();
    }

    [Key]
    public string Id { get; set; }

    [Required]
    public string UserName { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string Phone { get; set; }
    public string MobilePhone { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public virtual IList<UserAddress> Addresses { get; set; }
}

public class Restaurant
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual IList<RestaurantAddress> Addresses { get; set; }

    public virtual IList<RestaurantFood> Menu { get; set; }

    public virtual IList<Review> Reviews { get; set; }

    [DataType(DataType.Url)]
    public string Website { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Fax { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public int Seats { get; set; }

    public double AverageRating { get; set; }
    public double AveragePrice { get; set; }
}

3 个答案:

答案 0 :(得分:2)

我不确定我是否正确使用了您的Q,但如果您使用的是互联网应用程序模板,则只需使用角色管理即可管理应用程序的访问控制。

首先,将一些角色添加到数据库的webpages_Roles表中。

然后,只需将用户添加到这些角色:

Role.AddUserToRole("role1");

现在,要过滤内容,您只需要完成两项工作:

1)使用[Authorize] attrib:

过滤控制器对相应角色的请求
[Authorize(Roles = "role1, role2, ...")]

2)将相应的内容渲染给相关用户。首先检索当前用户的角色:

var roles = Roles.GetRolesForUser(User.Identity.Name);

然后,根据他/她的角色,为他/她呈现内容:

bool hasRole1 = roles.Contain("role1") | roles.Contain("admin");
// ...
@if (hasRole1)
{
    // Show content for role1 users...
}

答案 1 :(得分:1)

可以根据用户角色进行授权。

在创建授权时,我们始终牢记它应该是动态的。新用户组将具有不同的权限。所以我建议的是将信息存储在数据库中。

例如

用户组 管理员 普通用户 Resturants

角色 所有特权 基本特权 中级特权

您需要使用操作过滤器来获取此信息。 http://msdn.microsoft.com/en-us/library/dd410209(v=vs.100).aspx

接下来,我们需要为每个角色分配权限

所有权限 - addUser,addResturant等(您可以使用友好名称进行管理。它可以在UI中显示,但我们需要存储控制器名称和操作名称。如果是addUser,友好名称将是Add User我们存储如下

ActionsTable (actionId, friendName, Controller, Action)
1 -Add User - Users - Add 

RolesActionMapTable (roleId, actionID)
1-1

RolesTable (RoleId,Role Name,Desc)
1-AllPrivileage

GroupsTable (GroupId, GroupName)
1-Admin

GroupRoleMap (groupId, roleID)
1-1

通过继承authorize属性创建自定义Autorize attriute,并将其应用为所有方法的过滤器。有一个重载功能,您可以检查用户是否可以访问该操作。因此,您可以阻止未经授权的访问。

修改

从路由数据中我们可以识别控制器和操作,因此我们可以使用userID,controller和action查询db是否允许,或者您可以获取用户组并检查它是否包含访问此权限的权限< / p>

编辑2

public class CustomAuthorizeAttribute: AuthorizeAttribute
{
   protected virtual bool AuthorizeCore(
    HttpContextBase httpContext)
 {
   // 1.Httpcontext can gives you the controller and action
   // 2. retrive the group of user and check the user is allowed to execute this action
   // 3. if allowed, then return true else return false.
   // 4. You can redirect to another page saying you are not allowed to access this action
  }
)
}


//In controller
public class EmployeeController: Controller {

 [CustomAuthorize]
  public Create()
   {
   }

}

希望这有帮助

答案 2 :(得分:0)

要通过精细控制以可扩展的方式实现此目标,您需要基于权限的授权。您可以尝试ASP Security Kit之类的内容。 ASP安全套件是从头开始构建的,用于构建这样的系统。

编辑:这就是它的工作原理:

  1. 您可以使用每种操作方法定义唯一的权限代码。例如,CreateRestaurant,ReserveRestaurant
  2. 这些权限代码存储在数据库的主权限表中。
  3. 您可以创建单独的角色表并相应地关联权限。但是,ASP Security Kit引入了implied permissions的新概念,因此您不需要将角色作为单独的构造;您只需创建一个更高级别的权限,例如'RestaurantOwner',并使其隐含其他权限。
  4. 有一个UserPermit表,它将权限与用户相关联。对于特定类型的用户,E.G。餐馆老板,您将在创建用户时指定适用的权限。
  5. 当用户登录时,您将其权限加载到内存中。
  6. 您需要一种机制,只有当用户拥有与该操作相关联的唯一权限代码时,才会执行每个控制器的操作。如果用户没有,您将重定向到默认页面,并显示“未授权操作”的消息
  7. 您还可以查看加载的用户权限以显示或隐藏菜单选项。
  8. ASP安全套件为您完成上述大部分工作;例如,它可以automatically infer permission code进行授权,因此您无需对其进行硬编码。此外,您还需要resource checks,以便不同的用户和餐馆老板不会互相篡改数据。

    披露:我是ASP Security Kit的创建者。