В C # как аутентифицировать пользователя на сетевом компьютере? - PullRequest
8 голосов
/ 23 января 2012

В C # как аутентифицировать пользователя на сетевом компьютере?Например, я хочу аутентифицировать пользователя testuser с паролем testpassword на компьютере EXAMPLEMACHINE с другого компьютера, подключенного к сети к EXAMPLEMACHINE.Например, я на MYMACHINE и хочу аутентифицироваться testuser с testpassword на EXAMPLEMACHINE.

Я попробовал следующее, но мне постоянно говорят, что Сервер LDAP недоступен :

PrincipalContext context =
    new PrincipalContext(ContextType.Domain, exampleMachineDomain);
return context.ValidateCredentials(username, password);

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Если вы не используете Active Directory, вы можете использовать что-то вроде этого:

using System.Security;
using System.DirectoryServices.AccountManagement;
    public struct Credentials
    {
        public string Username;
        public string Password;
    }
    public class Domain_Authentication
    {
        public Credentials Credentials;
        public string Domain;
        public Domain_Authentication(string Username, string Password, string SDomain)
        {
            Credentials.Username = Username;
            Credentials.Password = Password;
            Domain = SDomain;
        }
        public bool IsValid()
        {
            using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
            {
                // validate the credentials
                return pc.ValidateCredentials(Credentials.Username, Credentials.Password);
            }
        }
    }

Если вы используете Active Directory, вы можете использовать что-то вроде этого:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

    // define a "query-by-example" principal - here, we search for a UserPrincipal 
    UserPrincipal qbeUser = new UserPrincipal(ctx);

    // if you're looking for a particular user - you can limit the search by specifying
    // e.g. a SAMAccountName, a first name - whatever criteria you are looking for
    qbeUser.SamAccountName = "johndoe";

    // create your principal searcher passing in the QBE principal    
    PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

    // find all matches
    foreach(var found in srch.FindAll())
    {
        // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
    }
2 голосов
/ 23 января 2012

Если ваши машины не находятся в домене, вам нужно использовать ContextType.Machine:

PrincipalContext context = 
    new PrincipalContext(ContextType.Machine, exampleMachineDomain);
return context.ValidateCredentials(username, password);
1 голос
/ 23 января 2012

Лучший способ сделать это - использовать WNetUseConnection, Win32 API, который обеспечивает наиболее прямой путь. По сути, вы пытаетесь позвонить

net use \\server password /user:myUserName,

Это то, для чего предназначен этот API.

Хороший пример ответа дан на на этот вопрос .

Поскольку функция PinvokeWindowsNetworking в случае успеха возвращает ноль, самый простой код аутентификации -

private static bool AuthenticateUserOnRemote(string server, string userName, string password)
{
    var connected = PinvokeWindowsNetworking.connectToRemote(server, userName, password);
    var disconnected = PinvokeWindowsNetworking.disconnectRemote(server);
    return connected == null;
}
1 голос
/ 23 января 2012

В этом ответе представлено несколько вариантов . Фрагмент, который вы вставили выше , должен работать, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...