现在,我的用户表有一个名为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
进入控制台我该如何防止这种事情发生?我正在考虑显示错误消息
答案 0 :(得分:2)
与其他关于使用Roles
和AuthorizeAttribute
的答案一致......在我看来,这是实现目标的更好方法,还有另一种方式。< / 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
{
}