Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 MVC4:传递用户组数据_Asp.net Mvc 4_Asp.net Membership - Fatal编程技术网

Asp.net mvc 4 MVC4:传递用户组数据

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类 除此之外,

我正在用ASP.NET重写我的PHP网站,并编写会员制

我知道我可以扩展MembershipUser以添加特定于成员的属性,但如何传递非特定于用户的布尔组信息,如使用搜索、编辑帖子等?我是否缺少一个框架项,或者我应该创建一个超级对象来传递此设置和其他设置


基本上,我希望它是访问控制器中用户组属性的有效方式。

除了扩展
成员资格提供程序
,您还可以扩展
角色提供程序
。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(角色可以有一个或多个访问权限)
UsersRoles表将用于向特定角色添加用户。 RoleAccessRights表用于定义每个角色的特定权限。 用户从不谈论功能。(顺便说一句,这个命名约定只是一个例子,您将遵循您的命名约定)

在我上次的工作中,这就是我们如何实现审计系统(它是基于Web表单的)。但是,在MVC中,您可以覆盖
AuthorizationAttribute
,以检查用户角色,并检查角色是否定义了访问权限。考虑到您有特定的安全需求,您必须在看到需要和必要性的每个操作上使用此属性

如果您计划实现此逻辑,请忘记成员资格、成员资格用户和角色。老实说,我不再使用这些类了。我有自己的自定义安全性,我实现了它,并在过去4个项目中使用了它,无需任何更新或修改

更新2:我们使用的安全解决方案基于自定义MembershipProvider和RoleProvider。现在想想,依赖于它是一个错误,因为对AccessLevel表的访问必须通过实体框架进行映射。因此,我们必须找到查询安全表的方法

我给你们的建议是完全忽略会员和角色相关的课程。第一个原因是,在重写提供程序时,可以避免使用不必要的方法和属性。方法体中有太多带有
throw new NotSupportedException()
的方法

建议的实施 您将需要以下表格:

  • 用户-(您至少需要三列UserId、UserName、Password)。如果你想散列密码,你可能还必须存储盐。其他列,如FirstName、LastName等。我建议您将其存储在不同的表中,并将其与UserId链接。至于用户ID类型,则取决于您是否使用
    int
    Guid
  • 角色-(至少需要两列RoleId、RoleName)。同样,与UserId一样,要使用哪种数据类型取决于您
  • 用户角色-存储用户ID和角色ID。您可能希望存储一些属性,例如角色是否为活动的,这是一个位值
  • 访问权限-这是存储访问权限密钥的地方。在您的情况下,如UseSearch、EditPosts、DeletePosts等。在这里,您应该至少使用三列AccessRightId、AccessRightKey和AccessRightDescription。如果您有很多访问权限密钥,那么这个描述字段将变得非常有价值
  • 角色访问权限这是您定义已向哪个角色添加特定访问权限的地方。还具有IsActive位值,以禁用角色的特定访问权限
  • 在MVC中,您将覆盖授权属性。在该属性中,您将指定具有控制器和/或操作访问权限的访问权限列表。你打算怎么做完全取决于你自己