Является ли плохой практикой контроль авторизованных атрибутов с использованием константных строк в публичном классе? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю большое приложение ASP.NET MVC. Мне нужно иметь возможность программно изменять права и разрешения пользователей для отдельных частей приложения, и я пытаюсь найти лучший подход для этого. Я начал с использования атрибута authorize следующим образом:

[Authorize(Roles = "Administrator,Moderator")]

По мере того, как приложение становилось больше, всякий раз, когда клиент хотел, чтобы я внес изменения в разрешения, мне нужно было пройти, найти все ссылки. для этого разрешения установите и добавьте и удалите роли соответственно. Сначала я отслеживал это, используя комментарии, но это быстро становилось слишком громоздким, поэтому я знал, что мне нужно создать что-то, что могло бы помочь мне сгруппировать роли на основе их коллективных прав доступа.

Я пытался найти решения или альтернативуварианты в интернете, но не хватило. Итак, я начал писать свой собственный класс, чтобы сделать это для меня, и мне пришлось сделать все переменные константами, чтобы их можно было использовать в атрибуте authorize, чтобы мой класс выглядел следующим образом:

public class RoleAccess
    {
        //List of roles
        private const string Coordinator= "Coordinator";
        private const string Moderator = "Moderator";
        private const string ApplicationAdministrator = "AppAdmin";
        private const string allRoles = Coordinator + "," + Moderator + "," + ApplicationAdministrator

        public const string EventsRead = allRoles;
        public const string EventsWrite = ApplicationAdministrator;

        public const string UserInfoRead = Moderator + "," + ApplicationAdministrator;
        public const string UserInfoWrite = ApplicationAdministrator;

public static bool HasAccess(string accessCSV, IPrincipal user)
        {
            List<string> accessList = accessCSV.Split(',').ToList();
            foreach (string role in accessList)
            {
                if (user.IsInRole(role))
                {
                    return true;
                }
            }
            return false;
        }
    }

И я получаю доступ к ролям, используя атрибуты authorize следующим образом:

[Authorize(Roles = RoleAccess.EventsWrite)]

Когда я работаю с разрешениями в представлении (независимо от того, должен ли HTML быть создан с помощью бритвы), я использую функцию HasAccess следующим образом:

@if (RoleAccess.HasAccess(RoleAccess., User))
            {
                <td class="no-sort">@Html.ActionLink("Edit", "Edit", new { id = User.ID })</th>
            }

Есть ли какие-либо проблемы с этим, и / или передовые практики, которым я не следую, используя этот подход? Я чувствую, что что-то упустил;некоторые проблемы, с которыми я столкнусь, если я сделаю это таким образом. Поэтому я хотел добавить его и получить обратную связь, прежде чем использовать его в любых производственных проектах.

Спасибо за любой совет, который вы можете дать!

...