创建具有特定规则的自定义Authorize属性

本文关键字:自定义 Authorize 属性 规则 创建 | 更新日期: 2023-09-27 18:15:29

我试图创建一个自定义授权属性来执行以下操作:

  1. 如果用户有一个"普通用户"的角色-他被重定向到/index/subscribe
  2. 所有其他用户(管理员、订户)都可以访问/Search/Index

当用户尝试打开Search控制器时。我创建了自定义的Authorize属性,如下所示:

public class DenyRegularUser : System.Web.Mvc.AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("~/User/Logon");
                return;
            }
            if (filterContext.HttpContext.User.IsInRole("Regular user"))
            {
                filterContext.Result = new RedirectResult("~/Index/Subscribe");
            }
        }
    }
这是我的搜索控制器:
namespace WebApplication2.Controllers
{
    [DenyRegularUser(Roles ="Regular user")]
    public class SearchController : Controller
    {
        // GET: Search
        public ActionResult Index()
        {
            return View();
        }
    }
}

但是由于某些原因,即使当我将用户的角色从普通用户更新为管理员或订阅者时,我也会被重定向到登录页面:/user/login…

这应该不会发生,因为登录功能工作完美,我得到了用户的角色…

我错过了什么??

创建具有特定规则的自定义Authorize属性

这可能有帮助。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class DenyRegularUser  : AuthorizeAttribute
{
    public DenyRegularUser() :
        base()
    {
    }
    protected override bool IsAuthorized (System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (AuthorizeRequest(actionContext))
        {
            return true;
        }
        return false;
    }
    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        //Code to handle unauthorized request
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.TemporaryRedirect);
        actionContext.Response.Headers.Add("Location", "~/Index/Subscribe");
    }
    private bool AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        //Write your code here to perform authorization
    }
}

我相信IsAuthorized方法是重写AuthorizeAttribute的正确方法。