Аутентификация с использованием различного количества клиентов с помощью oidc JWT - PullRequest
0 голосов
/ 24 января 2019

Мне нужно защитить WebApi и использовать oAuth. Есть множество подходов, но я не могу найти тот, который соответствует моим потребностям.

Я пытаюсь защитить свой сервис с помощью oAuth, но я не уверен, как это сделать. Это всего лишь история о моем опыте, связанном с миром аутентификации / авторизации.

Я пытаюсь разработать сервис, в котором я хочу, чтобы пользователи идентифицировали себя. Возможно, я захочу создать репозиторий для пользователей, но пока я в порядке, разрешив вход только сторонним поставщикам, таким как Google, Microsoft, Twitter и т. Д.

Я пишу бэкэнд, используя архитектуру микросервисов (AspNet Core (2.2)) с запросами маршрутизации API шлюза к нужному микросервису. Пока все хорошо, все работает отлично!

Мой сервис представлен с использованием внешней среды (Angular), которая взаимодействует с API шлюза. Опять все хорошо здесь.

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

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

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

Я также понимаю, что OpenID Connect (OIDC) является своего рода супернабором oAuth, добавляющим возможности авторизации. Опять же, я думаю, что есть много доступной информации, но ничего, что действительно соответствует моим потребностям.

Короче говоря, мой вопрос в том, что у меня много (ASP.NET Core WebApi) сервисов и (одна или несколько) интерфейсная система, которую я хочу частично защитить с помощью аутентификации и авторизации.

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

Какие системы или услуги вы рекомендуете? Я чувствую, что IdentityServer4 действительно соответствует моим потребностям. Если это так, мне просто нужно разобраться. Кривая обучения огромна, но все в порядке. Однако я не люблю тратить много времени на систему, которая не работает для меня.

Опять же, какое решение вы рекомендуете, желательно бесплатно;)

1 Ответ

0 голосов
/ 25 января 2019

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

...
"Clients": {
"Confidential": {},
"Public": {

  "angularapp1": {
    "ClientId": "spa-app1",
    "ClientName": "client application1",
    "ClientUri": "http://localhost:4200", // for development case
    "RequireConsent": false,
    "AllowedGrantTypes": [ "implicit" ], // the authorization flow to use
    "AllowAccessTokensViaBrowser": true,
    "RedirectUris": [
      "http://localhost:4200/#/auth-callback#", // post login redirect
      "http://localhost:4200/assets/html/silent-refresh-redirect.html" // silent refresh 
    ],
    "PostLogoutRedirectUris": [ "http://localhost:4200?postLogout=true" ],
    "FrontChannelLogoutUri": "http://localhost:4200?frontchannellogout=true",
    "FrontChannelLogoutSessionRequired": true,
    "AllowedCorsOrigins": [ "http://localhost:4200" ],
    "AllowedScopes": [ "openid", "profile", "email" ], //alowed scopes
    "IdentityTokenLifetime": 18000,
    "AccessTokenLifetime": 18000
  },
 "angularapp2": {...}


...
}

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

enter image description here

я использую oidc-client.js это очень полезная библиотека JavaScript с полезными методами и событиями

...