创建具有特定规则的自定义Authorize属性
本文关键字:自定义 Authorize 属性 规则 创建 | 更新日期: 2023-09-27 18:15:29
我试图创建一个自定义授权属性来执行以下操作:
- 如果用户有一个"普通用户"的角色-他被重定向到/index/subscribe
- 所有其他用户(管理员、订户)都可以访问/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…
这应该不会发生,因为登录功能工作完美,我得到了用户的角色…
我错过了什么??
这可能有帮助。
[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的正确方法。