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

.NET Core Identity Server 4 Аутентификация Аутентификация подлинности VS

Я пытаюсь понять правильный способ сделать аутентификацию в ASP.NET Core. Я просмотрел несколько ресурсов (большинство из которых устарело).

Некоторые люди предоставляют альтернативные решения, предлагающие использовать облачное решение, такое как Azure AD, или использовать IdentityServer4 и размещать мой собственный Token Server.

В старой версии .Net одной из самых простых форм аутентификации было бы создание пользовательского Iprinciple и сохранение дополнительных пользовательских данных аутентификации внутри.

public interface ICustomPrincipal : System.Security.Principal.IPrincipal
{
    string FirstName { get; set; }

    string LastName { get; set; }
}

public class CustomPrincipal : ICustomPrincipal
{
    public IIdentity Identity { get; private set; }

    public CustomPrincipal(string username)
    {
        this.Identity = new GenericIdentity(username);
    }

    public bool IsInRole(string role)
    {
        return Identity != null && Identity.IsAuthenticated && 
           !string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(Identity.Name, role);
    }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return FirstName + " " + LastName; } }
}

public class CustomPrincipalSerializedModel
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Затем вы будете сериализовать свои данные в файл cookie и вернуть его клиенту.

public void CreateAuthenticationTicket(string username) {     

    var authUser = Repository.Find(u => u.Username == username);  
    CustomPrincipalSerializedModel serializeModel = new CustomPrincipalSerializedModel();

    serializeModel.FirstName = authUser.FirstName;
    serializeModel.LastName = authUser.LastName;
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string userData = serializer.Serialize(serializeModel);

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1,username,DateTime.Now,DateTime.Now.AddHours(8),false,userData);
    string encTicket = FormsAuthentication.Encrypt(authTicket);
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
    Response.Cookies.Add(faCookie);
}

Мои вопросы:

  • Как я могу аутентифицироваться аналогично тому, как это было сделано в предыдущей версии .Net, старый способ все еще работает или есть более новая версия.

  • Каковы плюсы и минусы использования ваших собственных токенов-серверов, создающих собственный собственный принцип?

  • При использовании облачного решения или отдельного сервера Token, как бы вы интегрировали его с вашим текущим приложением, мне все равно нужна таблица пользователей в моем приложении, как бы вы связали эти два?

  • Поскольку существует так много разных решений, как я могу создать корпоративное приложение, чтобы разрешить вход в систему через Gmail/Facebook, хотя он еще может расширяться до других

  • Каковы некоторые простые реализации этих технологий?
4b9b3361

Ответ 1

TL; DR

IdentityServer = службы шифрования и проверки токенов через OAuth 2.0/OpenId-Connect

ASP.NET Identity = текущая стратегия управления идентификацией в ASP.NET

Как я могу аутентифицироваться аналогично тому, как это было сделано в предыдущей версии .Net по-прежнему работает старый способ или есть более новая версия.

Я не вижу причин, по которым вы не смогли бы достичь старого пути в ASP.NET Core, но в целом эта стратегия была заменена на ASP.NET Identity, а ASP.NET Identity жив и здоров в ASP.NET Core.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

ASP.NET Identity использует резервное хранилище, такое как SQL Server, для хранения пользовательской информации, такой как имя пользователя, пароль (хэшированный), электронная почта, телефон, и может быть легко расширено для хранения FirstName, LastName или чего-либо еще. Таким образом, на самом деле нет причин шифровать пользовательскую информацию в cookie и передавать ее от клиента к серверу. Он поддерживает такие понятия, как утверждения пользователей, токены пользователей, роли пользователей и внешние логины. Вот сущности в ASP.NET Identity:

  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogins (для связи с внешними провайдерами идентификации, такими как Google, AAD)
  • AspNetUserTokens (для хранения таких вещей, как access_tokens и refresh_tokens, накопленных пользователем)

Каковы плюсы и минусы использования собственных стихов токен-сервера для создания собственного принципа?

Сервер маркеров - это система, которая генерирует простую структуру данных, содержащую информацию об авторизации и/или аутентификации. Авторизация обычно принимает для токена с именем access_token. Это были бы, так сказать, "ключи от дома", позволяющие вам пройти через дверной проем и в резиденцию защищенного ресурса, обычно веб-интерфейса. Для аутентификации id_token содержит уникальный идентификатор для пользователя/персоны. Хотя такой идентификатор обычно помещают в access_token, теперь для этого существует специальный протокол: OpenID-Connect.

Причиной наличия вашей собственной службы маркеров безопасности (STS) может быть защита ваших информационных активов с помощью криптографии и контроль того, какие клиенты (приложения) могут получить доступ к этим ресурсам. Кроме того, стандарты для контроля идентичности теперь существуют в спецификациях OpenID-Connect. IdentityServer является примером сервера авторизации OAuth 2.0 в сочетании с сервером аутентификации OpenID-Connect.

Но ничего из этого не требуется, если вы просто хотите использовать пользовательскую таблицу в своем приложении. Вам не нужен токен server-, просто используйте ASP.NET Identity. ASP.NET Identity сопоставляет вашего пользователя с объектом ClaimsIdentity на server-, не требуя специального класса IPrincipal.

При использовании облачного решения или отдельного токен-сервера, как бы вы интегрировали это с вашим текущим приложением, мне все равно понадобилась бы таблица пользователей в моем приложении, как бы вы связали их?

См. Эти учебные пособия для интеграции отдельных решений для идентификации с приложением: https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html https://auth0.com/docs/quickstart/webapp/aspnet-core

Как минимум, вам потребуется таблица из двух столбцов, отображающая имя пользователя в идентификатор пользователя внешнего поставщика. Это то, что таблица AspNetUserLogins делает в ASP.NET Identity. Строки в этой таблице, однако, зависят от того, что является пользовательской записью в AspNetUsers.

ASP.NET Identity поддерживает внешних поставщиков, таких как Google, Microsoft, Facebook, любой поставщик OpenID-Connect, Azure AD уже есть. (Google и Microsoft уже внедрили протокол OpenID-Connect, поэтому вам не нужны их специальные пакеты интеграции, как, например, этот). Кроме того, ADFS еще не доступна в ASP.NET Core Identity.

Посмотрите этот документ, чтобы начать работу с внешними провайдерами в ASP.NET Identity:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/

В связи с тем, что существует так много различных решений, как я могу создать корпоративное приложение, чтобы разрешить вход в систему через Gmail/Facebook, при этом сохраняя возможность расширения до других SSO

Как объяснено выше, ASP.NET Identity уже делает это. Довольно просто создать таблицу "Внешних провайдеров" и данные управляют процессом внешнего входа в систему. Поэтому, когда появляется новый "SSO", просто добавьте новую строку со свойствами, такими как URL провайдера, идентификатор клиента и секрет, который они вам дают. ASP.NET Identity уже имеет встроенный пользовательский интерфейс в шаблонах Visual Studio, но см. " Вход в социальные сети" для получения более интересных кнопок.

Резюме

Если вам просто нужна таблица пользователей с возможностями входа с паролем и профилем пользователя, то ASP.NET Identity идеально подходит. Не нужно привлекать внешние органы. Но если многим приложениям требуется доступ к множеству API-интерфейсов, тогда имеет смысл иметь независимый орган для защиты и проверки токенов идентификации и доступа. IdentityServer хорошо подходит, или смотрите openiddict-core, или Auth0 для облачного решения.

Мои извинения за то, что это не попадает в цель или если это слишком вводный. Пожалуйста, не стесняйтесь взаимодействовать, чтобы добраться до глаза быка, которую вы ищете.

Приложение: Аутентификация куки

Чтобы выполнить аутентификацию с использованием файлов cookie, выполните следующие действия. Но, насколько мне известно, пользовательский принципал претензий не поддерживается. Чтобы добиться того же эффекта, используйте список ClaimPrincipal объекта ClaimPrincipal.

Создайте новое веб-приложение ASP.NET Core 1.1 в Visual Studio 2015/2017, выбрав "Нет аутентификации" в диалоговом окне. Затем добавьте пакет:

Microsoft.AspNetCore.Authentication.Cookies

Под методом Configure в Startup.cs поместите это (перед app.UseMvc):

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "MyCookieMiddlewareInstance",
    LoginPath = new PathString("/Controller/Login/"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
});

Затем создайте пользовательский интерфейс входа в систему и опубликуйте HTML-форму в методе действий, например:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // check user password hash in database
        // retrieve user info

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username),
            new Claim("FirstName", "Alice"),
            new Claim("LastName", "Smith")
        };

        var identity = new ClaimsIdentity(claims, "Password");

        var principal = new ClaimsPrincipal(identity);

        await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);

        return RedirectToLocal(returnUrl);
    }

    ModelState.AddModelError(String.Empty, "Invalid login attempt.");

    return View();
}

Объект HttpContext.User должен иметь ваши собственные утверждения и легко извлекаться из коллекции List из ClaimPrincipal.

Я надеюсь, что этого достаточно, так как полное решение/проект кажется немного для поста StackOverflow.

Ответ 2

TL; DR

Мне бы очень хотелось показать полную публикацию о том, как правильно реализовать IdentityServer4, но я старался вместить весь текст, но он был за пределом того, что StackOverflow согласен, поэтому я исправлю некоторые советы и все, что у меня есть узнал.

Каковы преимущества использования Token Server Vs ASP Identity?

Маркер-маркер имеет много преимуществ, но он не подходит для всех. Если вы внедряете такое корпоративное решение, в котором вы хотите, чтобы несколько клиентов могли войти в систему, Token Server - ваш лучший выбор, но если вы просто создаете простой веб-сайт, который хочет поддерживать внешние логины, вы можете получить Away With ASP Identity и некоторые Middleware.

Identity Server 4 Советы

Identity server 4 довольно хорошо документирован по сравнению со многими другими фреймворками, которые я видел, но с самого начала трудно начинать с нуля и видеть всю картину.

Мой первый mistak пытался использовать OAuth в качестве аутентификации. Да, есть способы сделать это, но OAuth для авторизации не является аутентификацией, если вы хотите аутентифицировать использование OpenIdConnect (OIDC)

В моем случае я хотел создать клиент javascript, который подключается к веб-api. Я посмотрел на множество решений, но изначально я попытался использовать webapi для вызова Authenticate from Identity Server и просто хотел, чтобы этот токен сохранялся, потому что он был проверен на сервере. Этот поток потенциально может работать, но у него много недостатков.

Наконец, правильный поток, когда я нашел образец Javascript Client, получил правильный поток. Клиент входит в систему и устанавливает токен. Затем у вас есть веб-приложение api, которое использует клиент OIdc, который будет проверять, что вы являетесь маркером доступа к IdentityServer.

Подключение к магазинам и миграции Сначала у меня было много неправильных представлений о миграции. У меня создалось впечатление, что запуск миграции Сгенерирован SQL из DLL изнутри, вместо использования вы настроили контекст, чтобы выяснить, как создать SQL.

Существует два синтаксиса для Migrations, которые знают, какой из них использует ваш компьютер:

dotnet ef migrations add InitialIdentityServerMigration -c ApplicationDbContext

Add-Migration InitialIdentityServerDbMigration -c ApplicationDbContext

Я думаю, что параметр после Migration - это имя, для чего вам нужно имя, которое я не уверен, ApplicationDbContext - это код-первый DbContext, в котором вы хотите создать.

Миграции используют некоторую автоматическую магию, чтобы найти строку подключения из того, как настроен ваш запуск, я просто предположил, что он использовал соединение с Server Explorer.

Если у вас есть несколько проектов, убедитесь, что у вас есть проект с ApplicationDbContext, установленным как ваш запуск.

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

Ответ 3

Я всегда использовал встроенную авторизацию/аутентификацию ASP.NET Identity (и ранее членство), я недавно применил Auth0 (https://auth0.com) и рекомендую это как что-то еще, чтобы попробовать.

Ответ 4

Социальные логины не сложно реализовать с помощью Identity, но есть некоторая начальная настройка, и иногда шаги, которые вы находите в Интернете в документах, не идентичны, обычно вы можете найти помощь для этого в разделе разработчиков платформы, на которой вы находитесь пытаясь настроить социальные логины для. Identity - это замена старой функции членства, найденной в устаревших версиях .net framework. Что я нашел удивительным, так это то, что использование крайних случаев, например, передача токена jwt, который у вас уже есть в веб-api, не рассматривается в примерах в Интернете даже при множественном числе, я уверен, что для этого вам не нужен свой собственный токен, но я не нашел ни одного примера о том, как передавать данные в сообщении get или post, которое не имеет отношения к самообслуживаемому серверу.

Ответ 5

ASP.NET Identity - это сборка, позволяющая аутентифицировать ваше приложение, будь то Bearer или Basic Authentication. Она дает нам готовый код для регистрации пользователя, входа в систему, изменения пароля и всего остального.

Теперь рассмотрим, что у нас есть 10 различных приложений, и во всех 10 приложениях невозможно сделать одно и то же. это очень хрупкая и очень плохая практика.

Чтобы решить эту проблему, мы можем централизовать нашу Аутентификацию и авторизацию, чтобы любое изменение не влияло на все наши 10 приложений.

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