.AddOAuth () против .AddOpenIdConnect () - PullRequest
0 голосов
/ 29 января 2020

Люди,

Можете ли вы уточнить для меня, в чем отличие и цель этих двух методов:

  1. Microsoft.Extensions.DependencyInjection.OAuthExtensions.AddOAuth ();
  2. Microsoft.Extensions.DependencyInjection.OpenIdConnectExtensions.AddOpenIdConnect ().

В соответствии с именем одно используется для авторизации, другое - для аутентификации пользователя, верно? Так что, если моему mvc приложению нужно знать, кто такой пользователь, мне нужно использовать .AddOpenIdConnect() для получения id_token? И если мне нужно вызвать службу ресурсов из приложения mvc от имени текущего пользователя, мне нужно добавить .AddOAuth(), чтобы получить access_token?

Эксперименты с auth0.com показали, что код с .AddOAuth() может получить маркер доступа в результате HttpContext.GetTokenAsync("access_token"), но ничего, если HttpContext.GetTokenAsync("id_token").

И наоборот - .AddOpenIdConnect() может получить id_token, но нет access_token.

Конфигурация для обоих равно:

.AddOAuth("oauth", o =>
            {
                o.AuthorizationEndpoint = "https://<Realm>.auth0.com/authorize?audience=resourceAPI-server";
                o.TokenEndpoint = "https://<REALM>.auth0.com/oauth/token";
                o.ClientId = "<clientID>";
                o.ClientSecret = "<secret>";
                o.CallbackPath = "/cb_oauth";
                o.SaveTokens = true;

            })
            .AddOpenIdConnect("openIdConnect", o =>
            {
                o.Authority = "https://<REALM>.auth0.com";
                o.ClientId = "<clientID>";
                o.ClientSecret = "<secret>";
                o.CallbackPath = "/cb_openIdConnect";
                o.SaveTokens = true;
                o.Events =new OpenIdConnectEvents()
                {
                    OnRedirectToIdentityProvider = rc =>
                    {
                        rc.ProtocolMessage.SetParameter("audience","resourceAPI-server");
                        return Task.CompletedTask;
                    }
                };
            })

Это действительно странно, так как я могу получить оба токена (access и id) в почтальоне с потоком кода и областью действия openid email profile.

Также учебники на auth0.com покажите, что .AddOpenIdConnect () с дополнительной областью действия также может получить токен доступа. Очень сбивает с толку.

Итак, какой для какого случая?

1 Ответ

1 голос
/ 29 января 2020

Платформа OAuth 2.0 описывает общие шаблоны для предоставления авторизации, но не определяет, как на самом деле выполнять аутентификацию.

OpenID Connect или OIDC - это расширение OAuth, которое добавляет и строго определяет токен ID для возврата информации о пользователе - это профиль OAuth 2.0, который определяет рабочий процесс для аутентификации.

Так что, если моему mvc приложению нужно знать, кем является пользователь, я должен использовать .AddOAuth ()

Рекомендуемый способ - использовать OID C, OpenID connect даст вам токен доступа плюс токен Идентификационный токен является JWT и содержит информацию об аутентифицированном пользователе. Ваше клиентское приложение будет проверять токен, декодировать токен для получения информации профиля пользователя с помощью расширения AddOpenIdConnect.

Но вы все равно можете использовать AddOAuth, разница в том, что OAuth требует, чтобы вы получили токен доступа от IDP для доступа к конечной точке управления пользователями провайдера идентификации, которая возвращает информацию профиля пользователя.

И если мне нужно вызвать службу ресурсов из приложения mvc от имени текущего пользователя, мне нужно добавить AddOpenIdConnect (), чтобы получить access_token?

OID C является расширением OAuth, поэтому вы можете использовать любой из них для получения токена доступа для доступа к защищенному ресурсу.

Это действительно странно, так как Я могу получить оба токена (access и id) в почтальоне с потоком кода и областью профиля электронной почты openid. Также учебники на auth0.com показывают, что .AddOpenIdConnect () с дополнительной областью также может получить токен доступа. Очень запутанно.

openid email profile являются OID C областями видимости. Если вы используете поток кода, вы не предоставили свою область, только области видимости OID C, также включен токен доступа на предъявителя. Это делается для того, чтобы ответ токена соответствовал OAuth 2.0 spe c. Для базовых c запросов аутентификации OpenID, где запрашивается только токен идентификатора, этот токен доступа является номинальным и может быть безопасно проигнорирован. Однако токен доступа вступает в действие, когда также запрашивается доступ к данным профиля пользователя в конечной точке UserInfo.

Но если вы хотите получить токен доступа для доступа к защищенному ресурсу / API, вам необходимо зарегистрировать ресурс в IDP (Auth0) и добавить OID C Scope, чтобы Auth0 мог запросить согласие пользователя на получение доступа. токен.

...