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);
    }
}

MVC防止访问控制器方法,如果特定的变量有特定的值

这个功能已经是用户角色了,您需要使用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);
    }
}
相关文章: