2017-02-21 21 views
0

Полное раскрытие информации, я не совсем понимаю мир windows auth, активный каталог и LDAP и мало опытным опытом с отдельными учетными записями пользователей через сервер sql. Кроме того, я обнаружил, что большинство документации в Интернете, особенно тех, которые выдвинуты Microsoft, предполагают, что вы развиваетесь в чистом мире Microsoft и имеете возможность реализовать самые современные и любые решения, рамки или услуги, которые они предоставляют.ASP.NET Объединение проверки подлинности Windows с группами пользовательских приложений/ролями

Я разрабатываю приложение для интрасети. И по разным причинам я не могу воспользоваться преимуществами групп/ролей Active Directory, но хотел бы как можно больше имитировать эту функциональность. Таким образом, мне нужно иметь возможность управлять пользователями/ролями/группами внутри приложения. Тем не менее, я хотел бы иметь возможность обнаруживать учетные данные Windows Auth пользователей в этом процессе. Другими словами, я не хочу, чтобы пользователь регистрировался и не хочу, чтобы они регистрировались, а использовали учетную запись Windows, в которую они вошли.

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

Это приложение MVC asp.net. В конечном итоге мне необходимо будет удовлетворить следующие требования в отношении авторизации.

1) Сравните текущего пользователя Windows с магазином и ролями приложения. Может использовать SQL-сервер.

2) Манипулирование функциональность на основе роли пользователей

3) позволяют для администратора для поиска AD и добавить домен \ пользователь в магазин, а также назначать группы

4) Создание групп и регистрации с компонентами приложения

Любая информация о том, как я могла бы обращаться по всем или обо всем этом, была бы весьма полезной.

+0

Вы говорите, что у вас нет Active Directory или у вас есть это, но вы не можете использовать его для своих цели? –

+0

, если вы не знакомы с «AD или LDAP», я бы предложил быстрый поиск google в «PrincipalContext» выведет гораздо больше головной боли из кодирования AD/LDAP в старые добрые времена – MethodMan

+0

Существует активный каталог, но не может использовать его больше, чем запрашивать информацию. – LCaraway

ответ

1

Что вы ищете является поставщиком пользовательских ролей. Это очень легко и просто сделать. Просто создайте класс, который наследуется от System.Web.Security.RoleProvider. Единственными методами, которые вам нужно реализовать, являются IsUserInRole и GetRolesForUser. Вы можете просто выбросить исключение NotImplementedException для всех других методов. Затем привяжите его к вашему приложению в Web.Config, установив элемент roleManager в System.Web.

public class CustomRoleProvider : RoleProvider 
{ 
    private mydatabase db; 

    public override string ApplicationName { get; set; } 

    public CustomRoleProvider() 
    { 
     db = new mydatabase(); 
    } 

    public override bool IsUserInRole(string username, string roleName) 
    { 
     //This will return the user object. 
     //To get the username of the logged on user, you can use User.Identity.Name 
     //To remove the domain name from the username: User.Identity.Name.Split('\\').Last(); 
     var user = db.CurrentUser(); 

     return user.Roles != null 
      && user.Roles.Count > 0 
      && (user.Roles.Exists(x => x.Roles.RoleNm == roleName)); 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     var user = db.CurrentUser(); 

     return user.Roles.Select(x => x.Roles.RoleNm).ToArray(); 
    } 

    #region not implemented 

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetAllRoles() 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetUsersInRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool RoleExists(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

, а затем, в Web.Config

<system.web> 
    <roleManager defaultProvider="CustomRoleProvider" enabled="true"> 
     <providers> 
      <clear /> 
      <add name="CustomRoleProvider" type="ThisProject.CustomRoleProvider, ThisProject" /> 
     </providers> 
    </roleManager> 
</system.web> 

ОТКАЗ: Есть вероятность опечаток в этом коде, но вы должны быть в состоянии получить gyst

+1

«... поставщик пользовательских ролей» или поставщик стандартной роли. Вам нечего останавливать на использовании стандартного поставщика роли (например, SqlRoleProvider). Именами в базе данных являются имена пользователей Windows в формате domain \ user (или имя_компьютера \ пользователь для локальных учетных записей). – Joe

+0

Был в состоянии заставить его работать со стандартным поставщиком ролей. Однако этот ответ решает вопрос! – LCaraway

0

Существует поставщик членства создан специально для ActiveDirectory:

https://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.110).aspx.

Вы можете реализовать этого провайдера в своем приложении. Кроме того, вы можете создать свой собственный поставщик членства, если вам нужны дополнительные функциональные возможности, что ActiveDirectoryMembershipProvider не обеспечивает:

https://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

0

Asp.Net Идентичность отделяет Идентичность Авторизация как два отдельных компонента.

По дизайну вы можете использовать элемент идентификации AD вместе с частью авторизации Asp.Net. Чтобы вы могли использовать локальный токен AD, чтобы идентифицировать WHO, пользователь, а затем использовать этот токен для назначения им привилегий (ролей и/или претензий) на основе этого идентификатора. Подобно тому, как вы также можете использовать идентификаторы Google, Facebook или Twitter. Очевидно, что если ваши органы AD не разрешат вам запрашивать AD для «кто является пользователем токена X», тогда этот ответ является спорным.

У меня нет времени идти дальше с этим прямо сейчас, но я думаю, что это должно начать вас в правильном направлении.

(Предостережение: вы МОЖЕТЕ ограничиваться использованием браузера Microsoft. Последнее, что я посмотрел, только IE отправит токен Active Directory с помощью HttpRequest, если запрос отправляется на локальный доменный сервер (он же «зона интранета») Я слышал, что Chrome позволит вам настроить его так же, но на самом деле никогда не делал этого.)