IdentityServer4 - Понимание потоков и конечных точек. Как это связано с OAuth и OpenIDConnect? - PullRequest
0 голосов
/ 10 февраля 2020

Я интегрирую аспект безопасности веб-приложения. Я решил использовать OAuth, поэтому у нас есть REST WebApi в As pNet Core 3.0, клиент, который является SPA, созданным в React , и Identity Server Приложение 4.0 , которое также находится в As pNet Core 3.0.

Я прочитал, что OAuth создан для авторизации, а не для аутентификации. Кажется, что для аутентификации существует что-то еще, называемое OpenIDConnect, поэтому первый вопрос, который мне приходит в голову и на который я не могу найти простой ответ: относятся ли технологии, связанные с OAuth, OpenIDConnect и IdentityServer?

Какое решение является лучшим для аутентификации, учитывая, что я хотел бы создать пользователей в базе данных SqlServer, и, если это возможно, я хотел бы использовать Entity Framework для porpose?

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

На данный момент проблема заключается в следующем: какая правильная конечная точка для этого поток: это / authorize или / token конечная точка? У меня много недоразумений по поводу приведенных выше вопросов.

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

Даже здесь я не имею ни малейшего понятия, какой из них лучше .

1 Ответ

1 голос
/ 10 февраля 2020

Я прочитал, что OAuth создан для авторизации, а не для аутентификации. Что касается аутентификации, кажется, что существует что-то еще, называемое OpenIDConnect, поэтому первый вопрос, который мне приходит в голову и на который я не могу найти простой ответ, таков: связаны ли технологии OAuth, OpenIDConnect и IdentityServer?

Вот так. OAuth был первым представленным и позволяет человеку, запрашивающему его, получить доступ к ресурсам (раздающим токены доступа). OID C (OpenID Connect) на другой стороне расширяет эту концепцию путем идентификации, части аутентификации.

Токен идентификации подтверждает личность человека в вашем приложении. Вместо предоставления идентификатора через имя пользователя + пароль (т. Е. Пользователь создает учетную запись на вашем веб-сайте), они перенаправляются к вашему провайдеру / приложению для аутентификации и вводят там свой логин, а взамен вы получаете идентификационный токен (и / или токен доступа, в зависимости от в потоке и областях, которые вы запрашиваете).

Идентификационный токен является токеном JWT (или эталонным токеном). Маркер JWT содержит всю информацию об идентификации пользователя, необходимую для вашего приложения (идентификатор пользователя, адрес электронной почты, отображаемое имя, возраст и т. Д. c.), И имеет криптографическую подпись. Только Identity Server знает ключ, используемый для его регистрации, и вы можете проверить его с помощью ключа publi c от поставщика OID C (здесь IdSrv).

Ссылочный токен работает аналогично, но заявки запрашиваются на стороне сервера и кэшируются.

С помощью токена идентификации вы не можете получить доступ к ресурсам пользователей. Пример: Facebook.

Когда вы входите в свое приложение с учетной записью Facebook, большая часть страницы запрашивает только идентификационный токен, чтобы подтвердить, что это тот же пользователь (вместо использования комбинации имени пользователя / пароля). Но при этом приложение не может получить доступ к вашим постам в Facebook или делать посты от вашего имени.

Если приложение запрашивает токен доступа (token scope), то также будет возвращен токен доступа (если приложению разрешено использование разрешенных областей). Вам будет предложено предоставить разрешения для ресурсов, которые запрашивает приложение. С этим маркером приложение может читать ваши сообщения или сообщения от вашего имени.

Это лучшее решение для аутентификации, учитывая, что я хотел бы создать пользователей в базе данных SqlServer, и, если это возможно, Я хотел бы использовать Entity Framework для свиньи?

Не имеет значения. Любой из них может быть использован, все, что вам действительно нужно, это утверждение "sid" (идентификатор субъекта) и связать его с вашим пользователем.

Identity Server может выдавать и то, и другое, в зависимости от того, что запрашивает клиент (если клиент запрашивает id_token тип ответа, он получает идентификационный токен, если он запрашивает token токен доступа. Оба могут быть указан или только один).

На этом этапе возникает проблема: какая правая конечная точка предназначена для этого потока: конечная точка / authorize или token? У меня много путаницы в ответах на вышеуказанные вопросы.

  • /authorize используется для авторизации пользователя (попросите его войти в систему и отправить обратно на ваш сайт). Он используется для так называемых интерактивных потоков, где пользователь вводит учетные данные
  • /token. В конечной точке можно получить только токен (поток владельца ресурса (имя пользователя + пароль), учетные данные клиента (для аутентификации между компьютерами), refre sh токен (чтобы получить новый токен доступа, используя токен refre sh (если вы запросили offline_access scope, который дает и refre sh токен)

Во-вторых, каков наилучший способ получения информации о пользователях: конечная точка /userinfo, см. Документы: http://docs.identityserver.io/en/latest/endpoints/userinfo.html

Как говорит do c для доступа к нему клиент должен запросить область действия openid.

Например, если моей конечной точке необходимо понять от вошедшего в систему пользователя, каковы его данные, я думаю, что или я получаю данные из конечной точки или из токена JWT.

Да, вы можете извлечь его из токена JWT, если вы используете токен JWT. Если вы используете эталонный токен, это просто идентификатор.

И последняя, ​​но не менее важная конечная точка /introspection может использоваться для проверки токена (если у вашего потребляющего приложения нет библиотек для расшифровки и проверки подписи токена). .

Если вы можете, лучше всего использовать клиентские библиотеки Identity Server (например, пакет IdentityServer4.AccessTokenValidation для ASP. NET Core или oid c -клиента для приложений на базе npm / javascript ) который должен подбирать правильные конечные точки, чтобы вам не пришлось об этом беспокоиться

...