C# 如何创建具有不同权限的页面';意见
我需要为不同类型的用户创建不同的页面视图。 我在这里已经问过: 尽管奥尔德尔的答案有效,但对我来说似乎不是最好的解决方案。我会解释原因的 我会尽量详细解释我需要什么,希望你们中的一些人能够帮助我:D 我需要展示不同的观点,但不仅仅是这样。每个用户都可以访问页面的不同部分 我举个例子: 想象一个具有这种结构的页面“X”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,但只能
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