Get ActionName, ControllerName and AreaName and pass it in ActionFilter Attribute
30,943
Solution 1
You could fetch them from the RouteData:
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
var rd = httpContext.Request.RequestContext.RouteData;
string currentAction = rd.GetRequiredString("action");
string currentController = rd.GetRequiredString("controller");
string currentArea = rd.Values["area"] as string;
...
}
Solution 2
Face the same issue just a moment ago and my solution is:
Define 2 attributes in your ActionAuthorizeAttribute class e.g.
public string ControllerName {get;set;} public string ActionName {get;set;}
While annotating your action of the controller specify them e.g.
[ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]** public ActionResult Disable(int id) { ... }
Author by
Saeid
Updated on October 05, 2020Comments
-
Saeid over 3 years
I use a custom AuthorizationFilter like the followings:
public class ActionAuthorizeAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { if(!httpContext.User.Identity.IsAuthenticated) return false; if(IsUserExcluded()) return false; else return IsRoleAuthorize(httpContext); } }
I use this filter at the top of each action I have, and for check Is Authorized, need Action Name, Controller Name, And Area Name. So is there any way to get this names in
AuthorizeCore()
method like useSystem.Web.HttpContextBase
? if answer is No then how can I get this names and pass it to attribute, obviously I don't want to add each name by hand, actually something likeViewContext.RouteData.Values["Controller"]
in controllers:[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)] public ActionResult Index() { return View(); }
Does any one have any idea about it?
-
gdoron is supporting Monica about 12 years"You could fetch them from the RouteData" Isn't a good answer. Now it was edited, I'll revert.
-
Peter Hedberg about 11 yearsThis could be just in ASP.NET MVC 4, but the area is found in rd.DataTokens["area"].
-
Anders M. about 10 yearsYou should change the line var rd = httpContext.Request.RequestContext.RouteData; to var rd = HttpContext.Current.Request.RequestContext.RouteData; better to use the standard one than a parameter :)
-
Darin Dimitrov about 10 years@AndersM., I would rather not do that. That would render my code extremely unit-test unfriendly. I always prefer working with abstractions. Can't remember when I last used
HttpContext.Current
in my career. -
MissingLinq almost 10 yearsThe area name will not be contained in the Values RouteValueDictionary. Rather, it will be contained in the DataTokens property, so to get the area you would want rd.DataTokens["area"] as string