Я пытаюсь узнать, как использовать идентификатор 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
в любом случае.