我有一个customroleprovider.cs 我有一个用户表,其中包含用户及其角色。大多数用户都有用户角色,只有3个管理员,现在我需要创建3个只读用户。这些用户只能查看整个网站,不能编辑网站的任何部分。在我看来,我有这些:
@{
var simpleRoles = (RoleProvider)Roles.Provider;
}
@if (simpleRoles.IsUserInRole(User.Identity.Name, "admin"))
{
}
仅为管理员限制某些区域,对于只读用户我是否需要这样的东西?
答案 0 :(得分:2)
由于您有管理员和用户,因此您可能需要创建“管理员”区域和“用户”区域。我在下面建议的只是你想要隐藏角色的几个视图。在管理区域中,您可以将authorize属性添加到该区域的基本控制器,以便只有管理员才能更新内容。否则,如果你想隐藏不同角色的更新按钮,你必须在视图中有if语句,这可能会变得混乱。
更新:
以下是区域概述的链接。区域很好,因为你可以创建一个名为“Admin”的区域,在该区域内你将拥有与不同区域分开的控制器/视图/视图模型等。在此区域内,您可以包含更新内容的逻辑,而如果您不希望角色更新内容,则不要在其区域内包含逻辑。希望链接能够比我更好地解释它。
当我为项目使用区域时,我将创建一个所有控制器都继承的基本控制器。我的基本控制器可能是一个例子:
[Authorize(Roles="Admin")]
public class AdminBaseController : Controller
{
...
}
然后在该区域的所有控制器中,我将从AdminBaseController继承,以便只有管理员才能访问该网站的这一部分。
public class HomeController : AdminBaseController
{
...
}
http://www.dotnet-tricks.com/Tutorial/mvc/a9P1010113-MVC-Areas-with-example.html
在视图上添加Authorize属性:
例如,如果您只想让管理员查看view.cshtml文件,那么您可以在控制器操作上执行以下操作:
[Authorize(Roles="admin")]
public ActionResult View()
{
....
}
如果用户不在该角色,那么他们将能够访问该视图。
对于多个角色,您可以执行以下操作:
[Authorize(Roles="admin, user")]
public ActionResult View()
{
...
}
这将允许任何管理员或用户查看该页面。 (他们不必兼任两种角色)。
答案 1 :(得分:1)
阐述我上面的评论。使用授权属性修改控制器操作会将其锁定到特定角色。这不能解决只读类型角色的问题。您需要在控制器操作中使用一些逻辑来评估角色,然后返回不同的视图。我建议将其放在BaseController中。让你的其他控制器继承它:
public abstract class BaseController : Controller
{
public bool IsReadOnly { get; set; }
public BaseController()
{
this.IsReadOnly = Roles.IsUserInRole("readonly");
}
}
public class HomeController : BaseController
{
[Authorize(Roles = "admin, user, readonly")]
public ActionResult Edit(int id)
{
if (!IsReadOnly)
{
return View("Details");
}
... other stuff
}
}
答案 2 :(得分:0)
在.cshtml中试试这个
@if ( User.Identity.IsAuthenticated ){
if ( User.IsInRole("Admin") ){
@Html.ActionLink("Admin", "AdminController")
}
}