2

我正在创建一个 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; }
}
4

3 回答 3

2

我不确定我的 Q 是否正确,但是如果您使用互联网应用程序模板,您可以使用角色管理简单地管理您的应用程序的访问控制。

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

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

Role.AddUserToRole("role1");

现在,对于过滤内容,您只需要做两项工作:

1) 使用 [Authorize] 属性过滤控制器请求到适当的角色:

[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...
}
于 2013-08-21T09:11:01.627 回答
1

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

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

例如

用户组管理员普通用户餐厅

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

您需要使用操作过滤器来获得它。 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

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

编辑

从路由数据中我们可以识别控制器和动作,因此我们可以使用用户ID、控制器和动作查询数据库是否允许,或者您可以获取用户组并检查它是否包含访问此权限的权限

编辑 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()
   {
   }

}

希望这可以帮助

于 2013-08-17T08:49:51.377 回答
0

要通过精细控制以可扩展的方式实现这一点,您需要基于权限的授权。您可以尝试ASP Security Kit 之类的东西。ASP 安全工具包是从头开始构建的,用于构建这样的系统。

编辑:这就是它的工作方式:

  1. 您为每个操作方法定义一个唯一的权限代码。例如,CreateRestaurant、ReserveRestaurant
  2. 这些权限代码存储在数据库的主权限表中。
  3. 您可以创建单独的角色表并适当地关联权限。但是,ASP Security Kit 引入了隐含权限的新概念,因此您不需要将角色作为单独的构造;您只需创建更高级别的权限,例如“RestaurantOwner”,并使其隐含其他权限。
  4. 有一个将权限与用户相关联的 UserPermit 表。对于特定类型的用户,例如餐厅老板,您将在创建用户时分配适用的权限。
  5. 当用户登录时,您将他的权限加载到内存中。
  6. 您需要一种机制,只有当用户拥有与该操作关联的唯一权限代码时,才能执行每个控制器的操作。如果用户不这样做,您会将他重定向到默认页面,并显示“未经授权的操作”消息
  7. 您还可以查看加载的用户权限以显示或隐藏菜单选项。

ASP Security Kit 为您完成了上述大部分工作;例如,它可以自动推断授权的权限代码,因此您不必对其进行硬编码。此外,您需要进行资源检查,以便不同的用户和餐馆老板不会互相摆弄数据。

披露:我是 ASP 安全工具包的创建者。

于 2013-08-17T08:58:22.647 回答