MVC C#阻止普通用户访问管理控制URL - 没有角色

时间:2017-08-02 13:36:01

标签: c# asp.net-mvc

现在,我的用户表有一个名为Admin的bool。如代码所示,如​​果user.admin = true,则用户可以看到管理区域按钮并访问它。

    @if (Common.UsuarioLogueado.Admin) {
                                <li><a href="@Url.Action("List","ClientesAdmin",new { Area = "Admin" })">Admin control panel</a></li>
                            }

这是按预期工作的。但是,非管理员用户仍可通过访问其网址http://localhost/appName/admin/ClientesAdmin/list

进入控制台

我该如何防止这种事情发生?我正在考虑显示错误消息

3 个答案:

答案 0 :(得分:2)

与其他关于使用RolesAuthorizeAttribute的答案一致......在我看来,这是实现目标的更好方法,还有另一种方式。< / p>

你可以简单地将用户重定向到另一个页面..最好是一个错误页面,说你无法访问所请求的页面,或者只是一个401页面AuthorizeAttribute如果你没有授权。

替代解决方案

public class ClientesAdmin : Controller {
    // [Authorize(Roles="Admin")]  could do it this way
    public ActionResult List() {
        // or..
         if(!Common.UsuarioLogueado.Admin)
         {
             return new HttpStatusCodeResult(401);
             // or
             // return View("Error") // usually there is an 'Error' view the Shared folder
         }

         return View();
    }
}

这不是最佳解决方案,但我不知道您的项目有多远,只是一个替代解决方案。

答案 1 :(得分:1)

我就是这样做的。但是,您的会员系统需要使用ASP.Net 角色才能正常工作。

在您的控制器中,您只需添加数据注释Authorize。对于客户端要访问的功能,必须登录并在该功能中指定滚动。

此解决方案可能无法直接剪切和粘贴,但您可以查看基本用法,然后对Authorize功能进行更多研究。

public class MyController : Controller {
     [Authorize(Roles="Admin")]
     public ActionResult AdminIndex() {
          return View();
     }



    [Authorize(Roles = "basic")]
    public ActionResult BasicUsersIndex() {
         return View();
    }
}

答案 2 :(得分:1)

理想情况下,您应该使用基于角色的访问控制。通过限制角色的访问,而不是表中的布尔值,您可以使用如下所示的授权属性来装饰您的CientesAdmin控制器。

[Authorize(Roles = "Admin")]
public class CientesAdminController : Controller
{ 
}

您还可以使用剃刀助手检查用户是否为IsInRole(“Admin”)。

网上有很多帮助可以引导您走这条路,但如果您的应用已经开发出来,您可能想要进行更改。然后建议创建自己的AuthoriseAttribue。就像是。

public class RestrictAccessToAdmins : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //Do the default Authorise Logic (Check if user is loggedin) 
        base.AuthorizeCore(httpContext);
         if (httpContext.User.IsInRole("Admin")) return true;

        var id = httpContext.User.Identity.GetUserId();

        using (ApplicationDbContext context = new ApplicationDbContext())
        {
            //Implement you own DB logic here returning a true or false. 
            return context.Common.First(u => u.userid == id).UsuarioLogueado.Admin;
        }
    }

}

要使用该属性,请执行以下操作。

[RestrictAccessToAdmins]
public class CientesAdminController : Controller
{ 
}

然后随着时间的推移,通过更好地理解默认的authorize属性和一些重构,您可以轻松地将属性更改为:)

[RestrictAccessToAdmins(Roles = "Admin")]
public class CientesAdminController : Controller
{ 
}