Использование аутентификации Active Directory и индивидуальных учетных записей в .NET Core - PullRequest
0 голосов
/ 26 сентября 2018

Мне было поручено создать приложение .NET Core (C # MVC), которое может проходить проверку подлинности через Active Directory или отдельные учетные записи пользователей.

В Интернете существует множество ресурсов по настройке того или другого, и я создал приложения с ними.Но возможно ли сделать оба?

Казалось бы, OAuth разрешает множественные маршруты аутентификации из коробки в .NET Core, но я предполагаю, что Active Directory не так легко работает, будучи настроенным в IIS и использующимоперационная система для авторизации.

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

Заранее спасибо за любые советы.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

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

0 голосов
/ 26 сентября 2018

вы можете работать над аутентификацией так, как вы думали, или вы можете сосредоточиться на подборе IdentityServer4, полнофункционального проекта аутентификации для того, что будет соответствовать вашим потребностям.

Вот еще один стекопотоквопрос это близко к тому, что вы ищете.Если вы не знакомы с работой IS4, вы можете создать проект на основе их шаблонов здесь;

dotnet new -i "identityserver4.templates::*"
...