Авторизация .NET Active Directory в двухуровневом приложении

Допустим, у нас есть ПК-станция (Windows 10), подключенная к Active Directory, и есть пользователь, который вошел в систему.

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

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

Как я могу проверить текущего пользователя в Active Directory, чтобы определить, могу ли я предоставить ему доступ к приложению или нет?


person John    schedule 30.06.2020    source источник
comment
ты решил проблему?   -  person Falco Alexander    schedule 04.07.2020
comment
@FalcoAlexander Посмотрите на мой ответ. Надеюсь, это поможет вам.   -  person John    schedule 07.07.2020


Ответы (2)


вы можете проверить идентификация окна:

bool System.Security.Principal.WindowsIdentity.GetCurrent().IsAuthenticated;
string System.Security.Principal.WindowsIdentity.GetCurrent().IsAuthenticated.Name;
person Falco Alexander    schedule 30.06.2020

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

public class ADAuthentication 
{
    private string userPrincipalName = UserPrincipal.Current.UserPrincipalName;
    private string userName = Environment.UserName;

    public string UserPrincipalName
    {
        get { return userPrincipalName; }
        set { userPrincipalName = value; }
    }

    public string Username
    {
        get { return userName; }
        set { userName = value; }
    }

    private string domainName;
    private string container;

    public enum AuthenticationMode { Credentials, ActiveDirectory };

    public AuthenticationMode GetAuthenticationType()
    {            
        if (String.Equals(domainName, Environment.UserDomainName, StringComparison.OrdinalIgnoreCase))
        {
            try
            {
                using (var domainContext = new PrincipalContext(ContextType.Domain, domainName, container))
                {
                    using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.UserPrincipalName, userPrincipalName))
                    {                            
                        if (foundUser != null && foundUser.Enabled == true)
                            return AuthenticationMode.ActiveDirectory;
                    }
                }
            }
            catch (AuthenticationException)
            {
                return AuthenticationMode.Credentials;
            }
            catch (PrincipalServerDownException)
            {
                return AuthenticationMode.Credentials;
            }
        }
        return AuthenticationMode.Credentials;
    }

    public ADAuthentication (string domainName)
    {            
        if (string.IsNullOrWhiteSpace(domainName))
            throw new InvalidOperationException("The domainName parameter is required.");

        string[] parts = domainName.Split('.');
        this.domainName = parts[0];
        this.container = string.Empty;
        for (int i = 0; i < parts.Length; i++)
        {
            string separator = string.IsNullOrEmpty(container) ? "" : ",";
            this.container += string.Format("{0}DC={1}", separator, parts[i]);
        }
    }                
}
person John    schedule 07.07.2020