1

我有一个 customroleprovider.cs 我有一个包含用户及其角色的用户表。大多数用户都有用户角色,只有 3 个管理员,现在我需要创建 3 个只读用户。这些用户只能查看整个网站,不能编辑网站的任何部分。在我看来,我有这些:

 @{
        var simpleRoles = (RoleProvider)Roles.Provider;
    }
    @if (simpleRoles.IsUserInRole(User.Identity.Name, "admin"))
    {
}

只为管理员限制某些区域,对于只读用户我是否需要这样的东西?

4

3 回答 3

2

由于您有管理员和用户,您可能需要创建一个“管理”区域和一个“用户”区域。我在下面建议的是,只有当您有一些想要隐藏角色的视图时。在管理区域中,您可以将授权属性添加到该区域的基本控制器,以便只有管理员可以更新内容。否则,如果您想隐藏更新按钮以防止不同的角色出现,则必须在视图中包含 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()
{
    ...
}

这将允许任何管理员或用户查看该页面。(他们不必同时担任这两个角色)。

于 2013-09-30T19:01:45.467 回答
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
    }
}
于 2013-09-30T19:30:06.007 回答
0

在 .cshtml 中试试这个

@if ( User.Identity.IsAuthenticated ){ if ( User.IsInRole("Admin") ){ @Html.ActionLink("Admin", "AdminController")
} }

于 2016-10-06T20:18:53.400 回答