1

Пожалуйста, помогите мне решить, как сделать авторизацию для моего проекта.Авторизация и аутентификация ASP.Net MVC

Проект написан в ASP.Net MVC и является приложением для интрасети, которое позволяет пользователям регистрироваться через Active Directory.

Пользователи могут быть младшим преподавателем, старшим преподавателем, руководителем или суперпользователем. Это достаточно легко с ролями, но ситуация сложнее, потому что эти роли основаны на любой информации, на которую вы смотрите. Например, младший преподаватель может видеть только информацию для студентов о том, что он читает лекции и т. Д.

Насколько я понимаю, здесь возникают претензии. Я должен назначить модули или учеников для пользователя.

Но процесс, если он еще более усложнен, потому что нет списка имен пользователей и их учеников/модулей в любом месте.

Мне нужно проверить несколько баз данных, чтобы узнать, разрешено ли пользователю просматривать информацию.

Иногда, хотя пользователь, имеющий доступ к определенной информации, не будет проходить ни одну из этих проверок. Из-за этого мне придется создать базу данных с именем пользователя AD, их ролью и их субъектами/студентами.

Так что мой вопрос действительно касается авторизации. Возможно ли, чтобы у меня был такой контроль над претензиями и как я их назначил и проверил?

Если это невозможно - как мне это сделать?

Имея инструкцию if в начале каждого действия в каждом Контроллере, он чувствует себя не так - но это все, что могут сделать мои коллеги.

+1

Мне удалось решить проблему немного ближе к тому, что у вас есть в последнее время. Я все еще пишу записи в блоге, но [это] (http://blog.dinklabs.com/2015/11/mvc-fine-grained-identity-access-control-1.html) - мой подход. –

ответ

1

Если вы создаете класс, который наследуется от AuthorizeAttribute, тогда у вас есть свобода делать любой сложный процесс авторизации, который вы считаете нужным. См. Мой ответ here о том, как это сделать.

Вот код, я использую для запроса и роли кэша AD:

private static Dictionary<Tuple<string, string>, bool> groupIdentityCache = new Dictionary<Tuple<string, string>, bool>(); 

..

public static bool UserHasRole(IIdentity identity, string groupShortName)  
{ 
    // (we rename our actual AD roles to shorter ones relevant to the site 
    // e.g. [MyAuthorizeAttribute(Roles = "Support,Admin")]) 
    if (!AdLongGroupNames.ContainsKey(groupShortName.ToUpper())) return false; 
    string fullADGroupName = AdLongGroupNames[groupShortName.ToUpper()];    
    Tuple<string, string> key = new Tuple<string, string>(identity.Name.ToUpper(), groupShortName.ToUpper()); 
    if (!groupIdentityCache.ContainsKey(key)) 
    { 
     using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))  
     { 
      using (GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, fullADGroupName)) 
      { 
       using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, GetLogin(identity))) 
       { 
        groupIdentityCache[key] = userPrincipal.IsMemberOf(groupPrincipal); 
       } 
      } 
     }     
    }    
    return groupIdentityCache[key]; 
} 

public static string GetLogin(IIdentity identity) 
{ 
    string[] parts = identity.Name.Split('\\'); 
    if (parts.Count() < 2) return parts[0]; else return parts[1]; 
} 

Если вы выполняете кеширование ролей, вы также должны очистить кеш на Session_Start, чтобы изменения вступили в силу.

Вы можете изменить это решение, чтобы включить роли из источников, отличных от AD (например, базы данных членства в классе и т. Д.), Добавив в словарь groupIdentityCache. Модификация groupIdentityCache также может помочь при тестировании.

0

Наличие неверного утверждения «если», это обойдется вам в длительную итерацию и огромное злоупотребление памятью.

В принципе, вы можете контролировать свою авторизацию на каждом уровне, используя атрибут authorize.

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

Вместо этого вы можете использовать операторы switch, что на практике будет намного лучше.

Обратите внимание:

Authorization Article, которые могут помочь вам понять.

+0

Где я могу использовать оператор switch? Спасибо за статью - проблема в том, что это не та часть, с которой у меня возникают проблемы. Фактически, единственное, что мне действительно нужно, это ЧИТАТЬ. Проблема в том, имеет ли этот пользователь доступ к этому модулю? Где я должен поставить контрольный код? – abiNerd

Смежные вопросы