Я создаю большое приложение 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>
}
Есть ли какие-либо проблемы с этим, и / или передовые практики, которым я не следую, используя этот подход? Я чувствую, что что-то упустил;некоторые проблемы, с которыми я столкнусь, если я сделаю это таким образом. Поэтому я хотел добавить его и получить обратную связь, прежде чем использовать его в любых производственных проектах.
Спасибо за любой совет, который вы можете дать!