Я собрал воедино некоторые ресурсы и решил создать простую настраиваемую аутентификацию, которая позволит Active Directory и отдельным учетным записям пользователей в моей базе данных.
Сначала я добавил ASP.NET Identity.в мой существующий проект .Я сделал интерфейсы Identity намного проще, чем в связанном ответе:
IdentityConfig.cs
public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(() => new Entities());
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Authentication/Login"),
});
}
}
После ответа Сэма (еще раз) на создавая пользовательскую аутентификацию / авторизацию в ASP.NET , я затем создал в базе данных простую таблицу пользователей и ролей Database-First, не основанную на Identity, и создал класс менеджера пользователей:
UserManager.cs
public class UserManager
{
private Entities db = new Entities();
public bool IsValid(string username, string password)
{
// TODO: salt and hash.
return db.USER.Any(u => u.USERNAME == username && u.PASSWORD == password);
}
}
Наконец, для завершения пользовательской аутентификации я создал простой мертвый контроллер аутентификации.Это проверит, если пользователь действителен, а затем создайте ClaimIdentity
.
AuthenticationController.cs
public class AuthenticationController : Controller
{
private Entities db = new Entities();
public ActionResult Login()
{
return View();
}
public ActionResult Logout()
{
HttpContext.GetOwinContext().Authentication.SignOut();
return RedirectToAction("Index", "Home");
}
[HttpPost]
public ActionResult Login(string username, string password)
{
UserManager um = new UserManager();
bool valid = um.IsValid(username, password);
if (valid)
{
// get user role and enditem
USER user = db.USER.Where(u => u.USERNAME == username).First();
string role = db.ROLE.Where(r => r.USERID == user.USERID).FirstOrDefault().ROLENAME;
// create session
Claim usernameClaim = new Claim(ClaimTypes.Name, username);
Claim roleClaim = new Claim(ClaimTypes.Role, role);
ClaimsIdentity identity = new ClaimsIdentity(
new[] { usernameClaim, roleClaim }, DefaultAuthenticationTypes.ApplicationCookie
);
// auth succeed
HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);
return RedirectToAction("Index", "Home");
}
// invalid username or password
ViewBag.error = "Invalid Username";
return View();
}
}
Эта простота, кажется, именно то, что я хочу, не имея большого объема, который является членством Identity или ASP.NET, и прекрасно работает.
Теперь, чтобы ответить на мой оригинальный вопрос - как мне также разместить пользователей Active Directory?
Хотя я абстрагировал и значительно упростил свои классы USER и ROLE, будут существенные дополнительные данные, которые потребуются для USER (роли, разрешения и т. Д.) - и эти данные не будут в Active Directory -мы должны создать пользователя независимо от.
Поэтому все, что мне нужно, это проверить имя пользователя и пароль в Active Directory!
Быстрая переменная конфигурации может изменить поток управления в действии Login
,и выполните это:
bool isValid = false;
if (authConfig == "AD") {
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "US"))
{
// validate the credentials
isValid = pc.ValidateCredentials(username, password);
}
} else if (authConfig == "Custom") {
isValid = um.IsValid(username, password);
}
// create claim...
Это решение стало возможным, поскольку единственная цель проверки подлинности Active Directory - это проверка их пользователя - никаких дополнительных данных от AD не требовалось.Кроме того, поскольку нам нужно указать Роль и другие данные в наших пользовательских таблицах, пользовательскую запись в любом случае пришлось создавать.
Мое замешательство, которое подтолкнуло к ответу, заключалось в отсутствии понимания того, насколько гибко создавать настраиваемую аутентификацию в .NET без использования того, что они запекали (например, проверка опции «Индивидуальные учетные записи пользователей» при созданииновый проект).
Приветствуются и другие предложения, поскольку это мой уровень знаний ASP.NET, но я считаю, что это подойдет для моего приложения.Я надеюсь, что это помогает чьей-то настройке аутентификации.