Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
只读角色c#mvc_C#_Asp.net Mvc - Fatal编程技术网

只读角色c#mvc

只读角色c#mvc,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个customroleprovider.cs 我有一个用户表,其中包含用户及其角色。大多数用户都有用户角色,只有3个管理员,现在我需要创建3个只读用户。这些用户只能查看整个网站,不能编辑网站的任何部分。我认为: @{ var simpleRoles = (RoleProvider)Roles.Provider; } @if (simpleRoles.IsUserInRole(User.Identity.Name, "admin")) { } 要限

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

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

要限制某些区域仅用于管理,我是否需要为只读用户提供类似的功能?

由于您有管理和用户,您可能需要创建一个“管理”区域和一个“用户”区域。我在下面建议的是,只有当您有一些视图想要隐藏在角色之外时。在管理区域中,您可以向该区域的基本控制器添加authorize属性,以便只有管理员可以更新内容。否则,如果要隐藏角色的不同显示的更新按钮,则必须在视图中使用if语句,这可能会变得混乱

更新:

下面是有关这些领域概述的链接。区域很好,因为您可以创建一个名为“Admin”的区域,在该区域内,您将拥有控制器/视图/视图模型等。。。与不同区域分开的。在此区域内,您可以包含更新内容的逻辑,而如果您不希望角色更新内容,则不要将逻辑包含在其区域内。希望链接能比我解释的更好

当我为我的项目使用区域时,我将创建一个基本控制器,我的所有控制器都从中继承。我的基本控制器的一个示例如下:

[Authorize(Roles="Admin")]
public class AdminBaseController : Controller
{
    ...
}
然后在我所在区域的所有控制器中,我将继承AdminBaseController,以便只有管理员可以访问网站的此部分

public class HomeController : AdminBaseController
{
    ...
}

在视图上添加“授权”属性:

例如,如果您只希望管理员查看view.cshtml文件,则可以在控制器操作上执行以下操作:

[Authorize(Roles="admin")]
public ActionResult View() 
{
    ....
}
如果用户不在该角色中,那么他们将能够访问该视图

对于多个角色,您可以执行以下操作:

[Authorize(Roles="admin, user")]
public ActionResult View()
{
    ...
}

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

详细阐述我的上述评论。用Authorization属性修饰控制器操作将使其锁定到特定角色。这并不能解决只读类型角色的问题。在控制器操作中需要一些逻辑来评估角色,然后返回不同的视图。我建议将其放置在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
    }
}
在.cshtml中试试这个

@if(User.Identity.IsAuthenticated){
if(User.IsInRole(“Admin”)){
@ActionLink(“管理员”、“管理员控制器”)
}
}

我可以添加多个角色吗?管理员和用户?是的,应该是[Authorize(Roles=“admin,user”)]。实际上,让我查一下语法来仔细检查正确的方法。但并不能解决“只读”的问题。您将需要添加一些逻辑来评估用户的角色,然后返回一个不同的视图——肮脏的示例:if(!Roles.IsUsersInRole(“readonly”){返回视图(“Details”,model);}我第一次误读了这个问题。我编辑了我的答案以提出建议。我想指出,在视图中使用
@if(){}
隐藏按钮并不能防止有人将post数据发送到控制器并导致操作执行;安全性必须在控制器级别实现。我有一个authorizeadmin控制器,所以我会将它们添加到控制器中。