Как я могу аутентифицировать пользователя, который не принадлежит пользователям домена в dotnetcore? - PullRequest
0 голосов
/ 05 марта 2020

В целях безопасности и управления мы создаем записи пользователей в отдельном контейнере, добавляем их в отдельную группу, делаем эту группу первичной, а затем удаляем их из группы «Пользователи домена». У меня все эти шаги работают, но сейчас я не могу найти способ их аутентификации. Я не знаю, какие классы я использую или мои аргументы, или что.

Предполагается:

AD_server = fully.qualified.domain
container = OU=My Users,OU=Accounts,DC=fully,DC=qualified,DC=domain
group = CN=App Users,OU=Software,DC=fully,DC=qualified,DC=domain
user = CN=Example,OU=Software,DC=fully,DC=qualified,DC=domain
sAMAccountName = Example
userPrincipalName = Example@MyUsers.fully.qualified.domain

Я пытался

new LdapConnection(
  new LdapDirectoryIdentifier(AD_server)
).Bind(
  new NetworkCredential(userPrincipalName,password)
)

new LdapConnection(
  new LdapDirectoryIdentifier(AD_server)
).Bind(
  new NetworkCredential(sAMAccountName,password)
)

new DirectoryEntry(
  "LDAP://"+AD_server+"/"+container,
  sAMAccountName,
  password
)

new DirectoryEntry(
  "LDAP://"+AD_server+"/"+container,
  userPrincipalName ,
  password
)

new DirectoryEntry(
  "LDAP://"+AD_server+"/"+group,
  sAMAccountName,
  password
)

new DirectoryEntry(
  "LDAP://"+AD_server+"/"+group,
  userPrincipalName ,
  password
)

new DirectoryEntry(
  "LDAP://"+AD_server+"/"+group,
  user,
  password
)

Я также пытался использовать метод PrincipalContext.ValidateCredentials () без успеха.

Во время создания:

this.principalContext = new PrincipalContext(ContextType.Domain,
  AD_server, // serves as domain and AD server
  container,
  adminUser,
  adminPassword);

У учетных данных администратора есть разрешения на внесение изменений в домен. Чтобы создать пользователя (начинается с объекта передачи):

UserPrincipal userPrincipal =
    UserPrincipal.FindByIdentity(principalContext, user.UserId + upnSuffix);
if (null == userPrincipal)
{
    userPrincipal = new UserPrincipal(principalContext)
    {
        SamAccountName = user.UserId,
        DisplayName = user.FullName,
        GivenName = user.FirstName,
        Surname = user.LastName,
        EmailAddress = user.Email,
        UserPrincipalName = user.UserId + upnSuffix,
        PasswordNeverExpires = true
    };
    //create user
    userPrincipal.Save();
}
return userPrincipal;

Установить пароль: userPrincipal.SetPassword(password);

1 Ответ

1 голос
/ 06 марта 2020

Если вы хотите убедиться, что ваш код аутентификации не является проблемой (я подозреваю, что это не так), вы можете попробовать аутентификацию непосредственно в Windows - либо войдите в Windows с этой учетной записью, либо используйте runas в командной строке:

runas /user:DOMAIN\username cmd

Я подозреваю, что у вас возникнет та же проблема, что будет означать, что существует проблема с созданием учетной записи. Я не создал учетные записи с UserPrincipal (у меня с DirectoryEntry), но я заметил разницу между тем, что вы делаете (создание учетной записи и затем установка пароля), и другими примерами онлайн , Вы можете попробовать:

  1. Переместить userPrincipal.SetPassword(password) до userPrincipal.Save() или
  2. Использовать конструктор , который принимает пароль , чтобы установить пароль при создании учетной записи:
userPrincipal = new UserPrincipal(principalContext, user.UserId, password, true)
{
    DisplayName = user.FullName,
    GivenName = user.FirstName,
    Surname = user.LastName,
    EmailAddress = user.Email,
    UserPrincipalName = user.UserId + upnSuffix,
    PasswordNeverExpires = true
};
//create user
userPrincipal.Save();

Проверьте, имеет ли это какое-либо значение.

...