Asp.net mvc 4 MVC4:传递用户组数据
我正在用ASP.NET重写我的PHP网站,并编写会员制 我知道我可以扩展MembershipUser以添加特定于成员的属性,但如何传递非特定于用户的布尔组信息,如使用搜索、编辑帖子等?我是否缺少一个框架项,或者我应该创建一个超级对象来传递此设置和其他设置Asp.net mvc 4 MVC4:传递用户组数据,asp.net-mvc-4,asp.net-membership,Asp.net Mvc 4,Asp.net Membership,我正在用ASP.NET重写我的PHP网站,并编写会员制 我知道我可以扩展MembershipUser以添加特定于成员的属性,但如何传递非特定于用户的布尔组信息,如使用搜索、编辑帖子等?我是否缺少一个框架项,或者我应该创建一个超级对象来传递此设置和其他设置 基本上,我希望它是访问控制器中用户组属性的有效方式。除了扩展成员资格提供程序,您还可以扩展角色提供程序。RoleProvider负责检查用户所属的组、注册新角色、将用户添加到角色等。要处理角色,您将使用包含许多静态方法的roles类 除此之外,
基本上,我希望它是访问控制器中用户组属性的有效方式。除了扩展
成员资格提供程序
,您还可以扩展角色提供程序
。RoleProvider负责检查用户所属的组、注册新角色、将用户添加到角色等。要处理角色,您将使用包含许多静态方法的roles类
除此之外,每次点击控制器时,都可以查询实现IPrincipal
的HttpContext.User
属性。此属性具有方法IsInRole
,用于与RoleProvider通信以获取用户是否在特定组中的信息
此外,为了允许访问控制器或操作,您可以使用Authorization
属性并列出有权访问控制器的特定角色
这些角色可以存储在cookie中(以缓存它们),或者您可以在全局.asax中实现应用程序_AuthenticateRequest
,并手动初始化GenericPrincipal
。此对象传递给HttpContext.User。此对象的构造函数接受使用IsInRole方法查询的角色数组
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
// Check if user is authenticated
if (HttpContext.User != null)
{
// Extract roles from a cookie if you used FormsAuthentication
// or read them from a cookie or from some other cached location
// Split roles into array of strings
var roles = listOfRoles.ToArray(); // If it is stored in a List<string>.
var identity = HttpContext.User.Identity;
var principal = new GenericPrincipal(identity, roles);
HttpContext.User = principal;
}
}
受保护的无效应用程序\u AuthenticateRequest(对象发送方,事件参数e)
{
//检查用户是否经过身份验证
if(HttpContext.User!=null)
{
//如果使用FormsAuthentication,则从cookie中提取角色
//或者从cookie或其他缓存位置读取它们
//将角色拆分为字符串数组
var roles=listOfRoles.ToArray();//如果存储在列表中。
var identity=HttpContext.User.identity;
var principal=新的GenericPrincipal(身份、角色);
HttpContext.User=principal;
}
}
以上代码未经测试。我发自内心地写下了它。它应该能让您很好地了解如何缓存角色并以最有效的方式使用它们
更新:如果您需要更高级的选项,其中每个角色可以有一个或多个功能,如“使用搜索”、“可以做某事”、“可以做那件事”,我将实施以下安全逻辑:
- 使用者
- 角色(用户属于角色)
- AccessRight(角色可以有一个或多个访问权限)
AuthorizationAttribute
,以检查用户角色,并检查角色是否定义了访问权限。考虑到您有特定的安全需求,您必须在看到需要和必要性的每个操作上使用此属性
如果您计划实现此逻辑,请忘记成员资格、成员资格用户和角色。老实说,我不再使用这些类了。我有自己的自定义安全性,我实现了它,并在过去4个项目中使用了它,无需任何更新或修改
更新2:我们使用的安全解决方案基于自定义MembershipProvider和RoleProvider。现在想想,依赖于它是一个错误,因为对AccessLevel表的访问必须通过实体框架进行映射。因此,我们必须找到查询安全表的方法
我给你们的建议是完全忽略会员和角色相关的课程。第一个原因是,在重写提供程序时,可以避免使用不必要的方法和属性。方法体中有太多带有throw new NotSupportedException()
的方法
建议的实施
您将需要以下表格:
int
或Guid