要做你想做的事,你不应该控制你的视图——你实际上必须保护你的控制器——而不是视图。您可以通过控制器属性执行此操作。类似的东西:
[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 团队在设置这方面做得很好,您不必单独检查控制器中的权限。我希望这有助于您入门。在线搜索有关如何使用 Authorization 属性的更多信息。
更新
如果您拥有控制这些权限的页面管理员,则您必须对如何设置 Authorize 属性保持清醒。这是“角色”非常重要的地方(根据我上面的示例)。例如,如果管理员说“我要将 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") %>
如果用户未经授权,您可以处理第二个RenderAction,因此视图甚至不会显示。 (您可以在控制器中检查。)
希望能澄清事情!我正在逃跑,所以我现在无法进一步扩展它。