要做你想要做的事,你不应该控制你的观点 - 你实际上必须保护你的控制器 - 而不是观点。你可以通过控制器属性来完成。类似的东西:
[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") %>
如果用户没有授权,您可以处理第二个RenderAction
,因此该视图甚至无法显示。 (您可以在您的控制器中查看。)
希望澄清事情!我正在运行,所以现在我无法再扩展它。
@JasCav谢谢你的回答。我已经在使用[Authorize]属性。不像你特别说的那样。我只用它来防止未经授权的访问。但是,除非我不能完全理解它是如何工作的,否则还有另一个问题。该权限将由该特定页面的adm设置(这就是为什么我使用了Facebook的示例)。我无法看到他希望别人看到而不是检查数据库。我怎样才能返回一个特定的局部视图?用户可以拥有字段a和b的权限,或者只有c或任何其他权限。您的解决方案适用于这种情况吗?再次感谢。 – eestein 2011-03-03 17:53:45
@eestein - 我的解决方案可以适用于您所描述的情况,假设它已正确设置。我现在正在写一个更新到我的答案 - 一会儿找。 – JasCav 2011-03-03 18:02:02
@JasCav谢谢,我会等。 – eestein 2011-03-03 18:05:00