MVC防止访问控制器方法,如果特定的变量有特定的值
本文关键字:变量 如果 访问 访问控制 方法 控制器 MVC | 更新日期: 2023-09-27 18:02:24
我试图找出如何防止访问控制器的方法,如果用户没有登录或不是管理员。我有一个类,里面的变量跟踪用户和他的状态(登录,管理等)。
我认为这可以通过使用ValidationAttribute
来完成。我以前没有使用过这种技术,所以我可能做错了什么。
AccountController.CS
[AdminUserValidation]
public ActionResult Index()
{
var account1 = account.GetAccountsWithType();
return View(account1.ToList());
}
AdminUserValidation.CS
public class AdminUserValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (UserSession.Current.IsAdmin)
{
//Allow access to the controller's method
}
else
{
//Prevent access to the controller's method and show error page (bad request/forbidden)
}
base.OnActionExecuting(filterContext);
}
}
这个功能已经是用户角色了,您需要使用UserManager为每个用户分配一个角色,如下所示:
User user = UserManager.FindById(userID);
UserManager.AddToRole(userID, roleID);
角色id可以由您创建,有一个默认的名为"AspNetUserRoles"的表,它将存储roleID, AddToRole将在"AspNetUserRoles"中插入记录。
然后在你的控制器中,你可以指定哪些角色应该能够访问整个控制器或单个方法。
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
...
}
用户需要注销并重新登录才能使角色生效,因为它存储在cookie中。
我使用以下代码解决了这个问题:
AccountController.CS
[AdminUserValidation]
public ActionResult Index()
{
var account1 = account.GetAccountsWithType();
return View(account1.ToList());
}
AdminUserValidation.CS
public class AdminUserValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (UserSession.Current.IsAdmin == false)
{
//Prevent access to the controller's method and show error page (bad request/forbidden)
filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden);
}
base.OnActionExecuting(filterContext);
}
}