我正在创建一个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; }
}
答案 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安全套件是从头开始构建的,用于构建这样的系统。
编辑:这就是它的工作原理:
ASP安全套件为您完成上述大部分工作;例如,它可以automatically infer permission code进行授权,因此您无需对其进行硬编码。此外,您还需要resource checks,以便不同的用户和餐馆老板不会互相篡改数据。
披露:我是ASP Security Kit的创建者。