Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 如何创建具有不同权限的页面';意见_C#_Asp.net_Asp.net Mvc 2_Modeling - Fatal编程技术网

C# 如何创建具有不同权限的页面';意见

C# 如何创建具有不同权限的页面';意见,c#,asp.net,asp.net-mvc-2,modeling,C#,Asp.net,Asp.net Mvc 2,Modeling,我需要为不同类型的用户创建不同的页面视图。 我在这里已经问过: 尽管奥尔德尔的答案有效,但对我来说似乎不是最好的解决方案。我会解释原因的 我会尽量详细解释我需要什么,希望你们中的一些人能够帮助我:D 我需要展示不同的观点,但不仅仅是这样。每个用户都可以访问页面的不同部分 我举个例子: 想象一个具有这种结构的页面“X” Field A Field B Field C Field D 当用户U1从组G1访问页面X时,系统会在页面X上检查数据库是否有该组的权限。用户U1可以查看字段A和字段B,但只能

我需要为不同类型的用户创建不同的页面视图。 我在这里已经问过:

尽管奥尔德尔的答案有效,但对我来说似乎不是最好的解决方案。我会解释原因的

我会尽量详细解释我需要什么,希望你们中的一些人能够帮助我:D

我需要展示不同的观点,但不仅仅是这样。每个用户都可以访问页面的不同部分

我举个例子:

想象一个具有这种结构的页面“X”

Field A
Field B
Field C
Field D
当用户
U1
从组
G1
访问页面
X
时,系统会在页面
X
上检查数据库是否有该组的权限。用户
U1
可以查看
字段A
字段B
,但只能编辑
字段A

设置为无组的用户
U2
访问页面
X
。系统在第
X页检查他的权限。用户
U2
可以查看和编辑所有字段

当用户
U3
从组
G2
访问页面
X
时,系统会在页面
X
上检查数据库是否有该组的权限。用户
U3
可以查看
字段C
字段D
,但不能编辑任何内容

我希望这很容易理解

我找不到一种方法来代替用大量关于特定用户权限的数据填充ViewData。在我的示例中,只有4个字段,但在我当前的项目中,我没有少于20个字段的屏幕。所以我想你可以看到这是多么丑陋和没有效率

正如我所说,这个想法类似于社交网络()。当用户访问UserX的页面时,只能看到UserX允许他访问的内容

我真的很感谢你的帮助


致以最诚挚的问候。

要执行您希望执行的操作,您不应该控制您的视图-实际上您必须保护您的控制器-而不是视图。可以通过控制器属性执行此操作。类似于此:

[Authorize]
public class MyController {
}
通过执行此操作,可以保护整个控制器。如果用户未经过身份验证,则该控制器内的每个操作都不会响应(具体来说,他们将收到401响应)。您可以通过授权单个用户或单个角色来扩展此功能,如下例所示:

[Authorize(Users="eestein,JasCav")
public class MyController {
}

[Authorize(Roles="Administrator")]
public class MyController {
}
在您的情况下,您可能不希望整个控制器上都有授权。很好,ASP.NET MVC提供了身份验证的操作级控制。因此,您可以这样做:

public class MyController {

    public ActionResult Index() { }

    [Authorize(Roles="Administrator")]
    public ActionResult Admin() { }

}
使用这个想法,您可以在这里控制用户在页面上看到的内容。您将希望从操作中返回部分页面,以便可以加载页面的各个方面。例如,您可能有一个显示一些正常数据和一些机密数据的视图。正常数据可以通过正常页面返回。机密数据应作为页面内的部分视图返回。但是,如果发生401,您可以处理它,而不显示任何内容

这相当简单。NET团队在这方面做得很好,您不必单独检查控制器中的权限。我希望这能帮助你开始。联机搜索有关如何使用授权属性的更多信息

更新 如果您的页面管理员正在控制这些权限,那么您必须明智地设置授权属性。这就是“角色”非常重要的地方(根据我上面的例子)。例如,如果管理员说,“我要将John Doe添加到SpecialUser角色”,则John Doe用户将能够访问角色设置为SpecialUser的所有操作(如果该角色确实是您系统上的角色)

显然,您必须为管理员提供一些能够做到这一点的方法,而Authorize属性可以完美地做到这一点。要查看谁对某个页面拥有权限,您必须查询数据库,找出谁是哪个角色的一部分。以下是一种考虑设置的方法:

  • 您可以控制操作的角色
  • 管理员可以控制授予这些角色的人
  • 您可以随时(通过简单的查询)查看谁被分配到了哪个角色。然后,您可以(通过您对操作角色的了解)查看谁看到了站点的哪个部分
我希望这能澄清(我希望我对你的问题理解得足够透彻)。我认为你想做的是可能的

更新2 是的,这确实假设控制器上有静态组,并且必须以编程方式添加任何新组。我很想知道什么样的用例需要动态创建不同的权限类型——这似乎会被滥用。无论如何,我没有解决这个问题的办法

至于局部视图是如何工作的…是这样的

public class ProductController : Controller
{
    //
    // GET: /Index/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Partial1()
    {
       return PartialView();
    }

    [Authorize]
    public ActionResult Partial2()
    {
       return PartialView();
    }
}
在Index.aspx文件中,您将有如下内容:

<%= Html.RenderAction("Partial1") %>
<%= Html.RenderAction("Partial2") %>

如果用户未经授权,您可以处理第二次
渲染
,因此视图甚至不会显示。(您可以在控制器内进行检查。)

希望事情澄清!我正在逃亡,所以我现在不能再扩展了。

我建议使用“附加”安全性;一个用户的权限和他的任何组的权限加在一起,给出了一系列允许他做的事情。如果他没有明确的许可去做需要许可的事情,他是不被允许做的。在您的情况下,在用户U1和组G1之间,有足够的权限授予用户查看字段A和字段B以及编辑字段A。由于用户本人或通过其组未明确授予用户编辑字段B或查看或编辑字段C和D的权限,因此他没有这些权限

我将通过在codebhind中放置一个方法来实现这种类型的权限,该方法将接受一个对象r