Я работаю над фрагментом, который отображает все маршруты ASP MVC для создания структуры меню, поэтому я нашел хорошие фрагменты, которые позволяют мне получить список ActionResults и их атрибутов.
В качестве последнего требования я хочу проверить, требуется ли для ActionResult аутентификация. Поскольку я могу проверить, имеет ли контроллер или само действие атрибут Authorized, я рассмотрел этот случай, но когда я регистрирую атрибут Authorization глобально, я не могу этого получить.
Есть ли способ зарегистрировать все глобальные фильтры?
Вот код моего фрагмента:
public static class MvcApplicationHelpers
{
public static List<MvcApplicationRoute> MapMvcApplicationRoutes(Type mvcApplicationType, ApplicationActionReturnTypeNames applicationActionReturnType = ApplicationActionReturnTypeNames.ActionResult)
{
var mvcAssembly = Assembly.GetAssembly(mvcApplicationType);
var assemblyProjectName = mvcAssembly.FullName.Split(',')[0];
return mvcAssembly.GetTypes()
.SelectMany(x => x.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(x => x.ReturnType.Name == applicationActionReturnType.ToString())
.Select(x => new MvcApplicationRoute
{
Controller = x.DeclaringType.Name.Replace("Controller", ""),
Action = x.Name,
ReturnTypeName = x.ReturnType.Name,
Area = x.DeclaringType.Namespace.ReplaceMany(assemblyProjectName,"Area",".Controllers","Controllers"),
Attributes = string.Join(",", x.GetCustomAttributes().Select(a => a.GetType().Name.Replace("Attribute", ""))),
ControllerAttributes = string.Join(",", x.DeclaringType.GetCustomAttributes().Select(a => a.GetType().Name.Replace("Attribute", ""))),
})
.ToList();
}
public static List<MvcApplicationNavigationRoute> MapMvcApplicationNavigationRoutes(Type mvcApplicationType, ApplicationActionReturnTypeNames applicationActionReturnType = ApplicationActionReturnTypeNames.ActionResult)
{
var mvcApplicationRoutes = MapMvcApplicationRoutes(mvcApplicationType, applicationActionReturnType);
return mvcApplicationRoutes
.Where(c => c.ReturnTypeName == ApplicationActionReturnTypeNames.ActionResult.ToString())
.GroupBy(c => new
{
c.Action,
c.Area,
c.Controller,
c.ControllerAttributes,
c.Attributes
})
.Select(c => new MvcApplicationNavigationRoute
{
Action = c.Key.Action,
Area = c.Key.Area,
Controller = c.Key.Controller,
RequiresAuthorization = ValidateAuthorizationRequiredAttributes(c.Key.Attributes, c.Key.ControllerAttributes),
})
.ToList();
}
private static bool ValidateAuthorizationRequiredAttributes(string attributes, string controllerAttributes)
{
string authorizedAttributeName = "Authorize";
if(attributes.Contains(authorizedAttributeName) || controllerAttributes.Contains(authorizedAttributeName))
{
return true;
}
return false;
}
}
public enum ApplicationActionReturnTypeNames
{
ActionResult,
PartialViewResult,
FileResult
}
public class MvcApplicationRoute
{
public string Area { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public string Method { get; set; }
public string ReturnTypeName { get; set; }
public string Attributes { get; set; }
public string ControllerAttributes { get; set; }
}
public class MvcApplicationNavigationRoute
{
public string Area { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public bool RequiresAuthorization { get; set; }
public bool RequiresPermission { get; set; }
public string[] AllowedRoles { get; set; }
public string NavigationName { get; set; }
public bool SpecialAccess { get; set; }
public string Permission { get; set; }
public string PermissionAction { get; set; }
}