Подтвердить что ты не робот

Как использовать ActiveDirectoryMembershipProvider с идентификатором ASP.Net?

Я пытаюсь узнать, как использовать идентификатор ASP.Net. Мой сценарий заключается в том, что я должен пройти проверку подлинности в Active Directory. Для этого я пытаюсь использовать ActiveDirecotoryMembershipProvider. Что мне нужно сделать -

  • Аутентификация пользователя/пароля в Active Directory.
  • Проверьте, присутствует ли пользователь в моей собственной базе данных.

Как я это сделал, я сконфигурировал в своем web.config, чтобы использовать ActiveDirectoryMembershipProvider в качестве поставщика членства по умолчанию. Затем я переопределяю метод PasswordSignInAsync в классе ApplicationSignInManager (который наследует SignInManager) следующим образом:

public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    var adok = Membership.Provider.ValidateUser(userName, password);
    if (adok)
    {
        var user = UserManager.FindByName(userName);
        if (user == null)
            return Task.FromResult<SignInStatus>(SignInStatus.Failure);
        else
        {
            base.SignInAsync(user, isPersistent, shouldLockout);
            return Task.FromResult<SignInStatus>(SignInStatus.Success);
        }
    }
    else
        return Task.FromResult<SignInStatus>(SignInStatus.Failure);
}

Это похоже на работу. Но я думаю, что это не правильный способ сделать это. Может ли кто-нибудь предложить лучший способ достичь этого?

UPDATE

Вот как я назвал вышеупомянутый

var result = await SignInManager.PasswordSignInAsync(username, password, isPersistent: false, shouldLockout: false);
switch (result)
{
    case SignInStatus.Success:
        return RedirectToAction("Index", "Home");
    case SignInStatus.LockedOut:
        return View("Lockout");
    case SignInStatus.Failure:
    default:
        ModelState.AddModelError("", "Invalid login attempt.");
        return View();
}

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

Было также высказано предположение, что я использую UserLogins, где я бы присвоил AD идентификатор провайдера. Но единственный способ, которым я могу это использовать, заключается в следующем:

IList<UserLoginInfo> loginInfos = await SignInManager.UserManager.GetLoginsAsync(username);
var valid = false;
foreach(var info in loginInfos)
{
    valid = Membership.Providers[info.ProviderKey].ValidateUser(username, password);
    if (valid) break;
}

Итак, если я хочу аутентифицировать пользователя против нескольких поставщиков, я могу создать ключ поставщика для каждого из них и назначить эти ключи поставщика для пользователей. И этот код будет проверять пользователя против них. Но где я должен поместить этот код? Какую конвенцию я должен придерживаться?

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

4b9b3361

Ответ 1

Вы не хотите смешивать MembershipProviders с личностью. То, что вы, скорее всего, захотите сделать, относится к регистрации в ActiveDirectory подобно тому, как идентификация относится к другим внешним входам (например, google/facebook).

В основном это сводится к сохранению имени пользователя AD в качестве логина:

userManager.AddLogin(<userId>, new UserLoginInfo("ActiveDirectory", "<ADUserName>")

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

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