Получение всех глобальных фильтров программно для веб-приложения ASP MVC - PullRequest
0 голосов
/ 27 апреля 2019

Я работаю над фрагментом, который отображает все маршруты 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; }
}

1 Ответ

0 голосов
/ 27 апреля 2019

В качестве последнего требования я хочу проверить, требует ли ActionResult Аутентификация.

Я не уверен, что понял ваше требование, но то, что вы делаете, звучит для меня нестандартно.

Если вы добавили атрибут [Authorize] глобально, то все ваши методы действий будут авторизованы по умолчанию. Если вы не хотите авторизовать определенный метод действия, добавьте к нему [AllowAnonymous].

public class MyController : Controller
{
    // Since you have globally registered [Authorize], this would be automatically Authorized
    public ActionResult MyAction()
    {
        // some code... 
    }

    [AllowAnonymous] // <-- do not authorize this action
    public ActionResult NoAuthorizeAction()
    {
        // some code... 
    }
}

Валидация - это совершенно другая вещь, она обычно выполняется в вашей модели ... Вы можете добавить встроенные атрибуты проверки, такие как [Required] или [Range], в свою модель ... вы можете определить свой собственный Пользовательский Атрибут валидации , или ваша модель может реализовать IValidatableObject . Все эти проверки будут выполнены в вашей модели, и вы можете проверить, действительно ли состояние модели в вашем контроллере ...

Я не уверен, почему вы хотите проверить атрибут авторизации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...