Использование Openiddict для управления идентификацией пользователей и доступа к приложениям - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть веб-API .NET Core, который использует openiddict для управления идентификацией, который связан с идентификацией ASP.NET в серверной части SQL. Многие приложения могут использовать этот API с подпиской. У меня есть следующие требования.

  1. API могут использовать только авторизованные приложения
  2. Каждое приложение может по желанию использовать функции идентификации API для управления пользователями, специфичными для их приложений, как это реализовано Openiddict в API (в настоящее время разрешены потоки авторизации, пароля и токена обновления).
  3. Все конечные точки должны требовать, чтобы приложение находилось в таблице приложений Oppenidict, и этот идентификатор приложения должен быть доступен при каждом запросе из-за мультитенантной поддержки в API.
  4. Конечные точки, имеющие атрибут [Authorize], должны иметь пользователя, аутентифицируемого с помощью модели идентификации Openiddict.

Чтобы реализовать требование (1), потребуется ли мне реализовать пользовательскую функцию авторизации, которая проверяет секрет приложения, или если в openiddict включен другой поток, обеспечивающий доступ к API только авторизованным приложениям (независимо от авторизовать атрибуты)? В этом случае пользователь может не проходить аутентификацию, но приложение все равно должно иметь права доступа к неавторизованным конечным точкам API.

Чтобы реализовать требование (2) для внешних поставщиков удостоверений, возможно ли настроить несколько секретов для каждого приложения, зарегистрированного в openiddict, чтобы позволить их пользователям использовать Facebook или Twitter для аутентификации? Это важно, потому что API должен был бы вызвать AddFacebook () во время конфигурации для каждого приложения, которое может получить доступ к API (не clientID и секрет самого API). Поскольку несколько приложений имеют свои собственные facebookID и секрет, я бы предположил, что это будет работать, только если openiddict может разрешить регистрацию нескольких идентификаторов и секретов для одного и того же типа провайдера, например, через AddFacebook ().

Для реализации требования (3) существует ли встроенный способ получения идентификатора вызывающего приложения из openiddict, как если бы пользователь был аутентифицирован?

1 Ответ

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

Для реализации требования (1), мне нужно будет реализовать пользовательскую функцию авторизации, которая проверяет секрет приложения, или если в openiddict включен другой поток, который заботится о том, чтобы только авторизованным приложениям был разрешен доступ к API(независимо от атрибутов авторизации)?

Начиная с RC3, идентификация клиента была сделана обязательной по умолчанию: если вы не отправите client_id, соответствующий записи в таблице приложений, ваш запрос будетбыть отвергнутым самим OpenIddict.В предыдущих версиях вы могли выбрать эту функцию, позвонив options.RequireClientIdentification() (теперь она отключена).

Для реализации требования (2) для внешних поставщиков удостоверений можно ли настроить несколько секретовдля каждого приложения, зарегистрированного в openiddict, чтобы позволить своим пользователям использовать Facebook или Twitter для аутентификации?Это важно, потому что API должен был бы вызвать AddFacebook () во время конфигурации для каждого приложения, которое может получить доступ к API (не clientID и секрет самого API).Поскольку несколько приложений имеют свои собственные facebookID и секрет, я бы предположил, что это будет работать, только если openiddict может разрешить регистрацию нескольких идентификаторов и секретов для одного и того же типа провайдера, например, через AddFacebook ().

Нет прямой связи между OpenIddict и схемами аутентификации, которые вы используете, поэтому нет, вы не можете настроить несколько учетных данных Facebook "через" OpenIddict, так как они не связаны между собой.

Предполагая, что вам это нужно для целей мультитенантности, вы можетехотите прочитать https://stackoverflow.com/a/49682427/542757, чтобы узнать, как можно переопределить монитор параметров по умолчанию в ASP.NET Core, чтобы можно было предоставлять специфичные для арендатора параметры для обработчиков аутентификации, таких как OpenIddict, Facebook, Google и все остальное.

Для реализации требования (3) существует ли встроенный способ получения идентификатора приложения вызывающего приложения из openiddict, как если бы пользователь был аутентифицирован?

Предполагая, что оно известно (то есть выне сделал явно клиентидентификация необязательна в опциях OpenIddict), да.Например, из контроллера MVC:

var result = await HttpContext.AuthenticateAsync(OpenIddictValidationDefaults.AuthenticationScheme);
Debug.Assert(result.Ticket != null, "The authentication ticket shouldn't be null.");

// The presenters list contains the authorized parties allowed to
// use the access token with your APIs. Usually, it contains a single value.
// Note: this extension requires a using for AspNet.Security.OpenIdConnect.Extensions.
var client = result.Ticket.GetPresenters().FirstOrDefault();
...