.Net Core Аутентификация и пользовательский сеанс - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в .Net Core (в настоящее время использую .Net Core 2.2) Авторизация и аутентификация.Я должен разработать механизм аутентификации и авторизации в моем новом проекте.Поискав в Интернете, я нашел несколько способов сделать это (используя Identity, не используя, используя Cookies, используя JWT и т. Д. И т. Д.).Я хотел бы, чтобы кто-то указал мне направление, которое бы подходило для моего сценария.Вот требования:

  • Я разрабатываю приложение как API.Поэтому мне нужно защитить свои конечные точки.
  • Аутентификация будет выполняться системой третьей части, которую предоставляет мой клиент.По сути, после получения имени пользователя и пароля в моей конечной точке Login мне придется запросить эту услугу.Затем служба сообщит мне, аутентифицируется ли пользователь, а также его роли.
  • Будучи аутентифицированным, я затем сделаю запрос в своей собственной базе данных, чтобы получить информацию о пользователе: его часовой пояс, язык и т. Д. Я хотел бычтобы получить эту информацию в сеансе, чтобы при каждом запросе от этого пользователя, который попадает на мой сервер, я получал язык, например, для возврата данных на правильном языке.
  • Приложение будет развернуто в дваразные серверы с балансировкой нагрузки.Пользователь, который вошел в систему на одном сервере, должен быть действительным на другом (серверы должны каким-то образом совместно использовать cookie / токен).

Я не знаком со многими вещами здесь.Я не знаю, возможно ли использовать cookie-аутентификацию для общего доступа между серверами или мне следует использовать JWT и сохранить ее в базе данных, может быть ...?Кроме того, как работает сессия в ядре .Net?Могу ли я каким-то образом связать сессию с JWT или чем-то в этом роде?

Какой подход был бы наилучшим / рекомендуемым здесь?

Любая помощь / учебное пособие высоко ценится.

Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Только некоторые из понятий:

Идентичность - это библиотека, используемая для настройки и управления базой пользователей, такой как регистрация, проверка пароля, сброс пароля и т. Д. Она управляет хранилищем, безопасность и много необходимых проверок.Эта часть, кажется, управляется вашим клиентом.Так что вам это не понадобится.

Файлы cookie / сеанс обычно используются веб-приложениями для отслеживания информации о текущем пользователе.Хотя это возможно использовать с веб-API, на самом деле это не рекомендуется и не делается.

JWT предназначены для установки без сохранения состояния.Веб-API в основном без состояний (REST).Это означает минимальное использование или ОЗУ, а не использование ОЗУ или базы данных для отслеживания состояния (чтобы понять, связан ли предыдущий запрос с текущим).JWT, который принимает ваши пользовательские данные, подписывается секретной строкой, которую вы можете предоставить, и создает подпись .Вы можете прочитать больше о JWT онлайн на таких веб-сайтах, как эти https://jwt.io.

Первым этапом для вас будет подключение к системе клиента для аутентификации.Поскольку вы намереваетесь подключиться к другому API на стороне сервера, вам необходимо использовать функцию AddHttpClient .NET Core.Во-первых, создайте класс примерно так:

public class MyAuthClient
{
    private readonly HttpClient httpClient;

    public MyAuthClient(HttpClient httpClient)
    {
        this.httpClient = httpClient;
    }

    public Dictionary<string, string> AuthorizeUser(string username, string password)
    {
        // use the httpClient send login and get confirmation from client's system
        if (loginFailed) return null;
        else
        {
            var result = new Dictionary<string, string>();
            result["userData1"] = "value"; // get these values from the http request you have created above.
        }
    }

}

В вашем стартапе добавьте это:

services.AddHttpClient<MyAuthClient>(client => {
    client.BaseAddress = new Uri("https://yourclientsystem.com");
});

Теперь, чтобы настроить аутентификацию JWT, есть несколько способов найти его в Интернете.,Я создал библиотеку под названием NetCore.Jwt, которая может быть весьма полезной в этом контексте.Если вам неудобно использовать его, вы можете либо извлечь его исходный код, либо использовать альтернативный вариант в Интернете.Как только это будет сделано, в файле startup.cs:

Используйте следующее в функции ConfigureServices:

services.AddAuthentication(NetCoreJwtDefaults.SchemeName).AddNetCoreJwt(options => 
{
    options.Secret = "yourVerySecretKeyThatYouWillBeSharingBetweenBothServers";
   // you can configure other options here too
});

И следующее в функции Configure:

app.UseAuthentication();

Приведенный выше код настраивает аутентификацию для ваших приложений с помощью JWT.Убедиться в том, что строка Secret одинакова в обоих приложениях, очень поможет убедиться, что вы используете один и тот же логин для обоих приложений.Небезопасно иметь такие строки в коде.Проверьте эту ссылку , чтобы понять, как хранить что-либо в безопасном формате.Теперь вам понадобится контроллер и действие, при котором вы берете логин пользователя и предоставляете действительный JWT.Это можно настроить примерно так:

public class AuthController : Controller
{
    private readonly MyAuthClient authClient;

    public AuthController(MyAuthClient authClient)
    {
        this.authClient = authClient;
    }

    public ActionResult<string> Login(string userName, string password)
    {
        var result = authClient.AuthorizeUser(userName, password);
        if (result == null) return BadRequest("invalid login");
        var claims = new List<Claim>();
        foreach (var r in result)
        {
            claims.Add(new Claim(r.Key, r.Value));
        }
        claims.Add(new Claim(ClaimTypes.Name, "usernameHere")); // this can be later accessed using User.Identity.Name
        claims.Add(new Claim(ClaimTypes.NameIdentifier, "userId"));
        string token = HttpContext.GenerateBearerToken(claims);
        return token;
    }

}

Наконец, чтобы ваш API можно было только авторизовать и использовать, убедитесь, что вы включили [Authorize] поверх каждого контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...