Настройка аутентификации LinkedIn/OAuth в ASP.NET Core 2.0

Я пытаюсь добавить аутентификацию LinkedIn в свое приложение ASP.NET Core 2.0, но получаю следующую ошибку:

Ни один обработчик аутентификации не настроен для обработки схемы: LinkedIn

Вот как я добавляю аутентификацию LinkedIn/OAuth в ConfigureServices в Startup.cs:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
   .AddCookie("internal_cookie", options => {
         options.AccessDeniedPath = "/Account/Forbidden/";
         options.LoginPath = "/Account/Login";
    })
   .AddCookie("external_cookie")
   .AddOAuth("LinkedIn", options => {

         options.SignInScheme = "external_cookie";
         options.ClientId = "1234567890";
         options.ClientSecret = "1234567890";
         options.CallbackPath = "/linkedin-callback";

         options.AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization";
         options.TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken";
         options.UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,email-address,picture-url,picture-urls::(original))";

         options.Scope.Add("r_basicprofile");
         options.Scope.Add("r_emailaddress");

         options.Events = new OAuthEvents
         {
             OnCreatingTicket = OnCreatingTicketLinkedInCallBack,
             OnTicketReceived = OnTicketReceivedCallback
         };
    })
    .AddFacebook(options =>
    {
          options.AppId = "1234567980";
          options.AppSecret = "1234567890";
          options.Events = new OAuthEvents
          {
             OnCreatingTicket = OnCreatingTicketFacebookCallback,
             OnTicketReceived = OnTicketReceivedCallback
          };
     })
     .AddGoogle(options =>
     {
           options.ClientId = "1234567890";
           options.ClientSecret = "1234567890";
           options.CallbackPath = "/google-callback";
           options.Events = new OAuthEvents
           {
              OnCreatingTicket = OnCreatingTicketGoogleCallback,
              OnTicketReceived = OnTicketReceivedCallback
           };
});

Где моя ошибка?

ОБНОВЛЕНИЕ: после внесения предложенных исправлений я получаю следующую ошибку:

Никакой IAuthenticationSignInHandler не настроен для обработки входа для схемы: social_login


person Sam    schedule 19.08.2017    source источник


Ответы (1)


Вы перепутали схему аутентификации, связанную с вашей пользовательской регистрацией обработчика LinkedIn, со схемой входа, которую OAuthHandler в конечном итоге вызовет для сохранения личности (обычно это экземпляр обработчика файлов cookie).

Исправьте свою регистрацию, чтобы указать LinkedIn в качестве схемы и social_login в качестве схемы входа (при условии, что ваш обработчик файлов cookie действительно называется social_login), и это должно работать:

services.AddAuthentication()
    .AddCookie("social_login")
    .AddOAuth("LinkedIn", options =>
    {
        options.SignInScheme = "social_login";

        // ...
    });

Примечание: вы можете удалить назначение SignInScheme, если social_login является схемой входа по умолчанию (т. е. если вы вызываете services.AddAuthentication("social_login") или services.AddAuthentication(options => options.DefaultSignInScheme = "social_login"):

services.AddAuthentication("social_login")
    .AddCookie("social_login")
    .AddOAuth("LinkedIn", options =>
    {
        // ...
    });
person Kévin Chalet    schedule 19.08.2017
comment
Я только что опубликовал обновление к своему исходному сообщению. Я на самом деле рад, что это произошло. Я хотел бы использовать разные схемы, чтобы мой внутренний файл cookie имел другое имя, чем те, которые я получаю от поставщиков социальной аутентификации. Я просто не уверен, как справиться с новой ошибкой, которую я получаю. - person Sam; 20.08.2017
comment
Экземпляр вашего обработчика файлов cookie называется social_login? Публикация всего кода поможет. - person Kévin Chalet; 20.08.2017
comment
Обновлен весь раздел кода в исходном сообщении, чтобы показать вам весь мой раздел конфигурации аутентификации. - person Sam; 20.08.2017
comment
Замените social_login на CookieAuthenticationDefaults.AuthenticationScheme в моем коде или обновите свой, чтобы использовать social_login в качестве имени обработчика файлов cookie. - person Kévin Chalet; 20.08.2017
comment
Означает ли это, что и мои внутренние файлы cookie, и те, которые я получаю от FB/Google/LinkedIn, будут иметь одно и то же имя? Я думаю, что было бы неплохо сделать их разными, чтобы только файлы cookie, которые я создаю внутри, принимались для аутентифицированных пользователей. Или я ошибаюсь в этом? - person Sam; 20.08.2017
comment
Я действительно не эксперт в этом, но если я правильно понимаю, я получаю куки от социальных провайдеров. В прошлом у меня были проблемы, когда мое приложение принимало эти файлы cookie и считало пользователя аутентифицированным. Что я делаю, так это то, что как только я получаю надлежащий ответ от социальных провайдеров, я уничтожаю этот файл cookie и создаю новый со всей необходимой мне информацией о пользователе, и использую этот файл cookie как мой законный файл cookie. Имеет смысл? - person Sam; 20.08.2017
comment
Вы не совсем получаете файл cookie от внешних поставщиков, но обработчик OAuth2 действительно создает его для вас, запрашивая у обработчика файлов cookie, представленного SignInScheme, сделать это, когда ваши пользователи достигают пути обратного вызова с кодом авторизации OAuth2. Возможно наличие двух отдельных файлов cookie (это подход, используемый ASP.NET Core Identity). Для этого просто создайте еще один экземпляр обработчика cookie: .AddCookie("internal_cookie").AddCookie("external_cookie"). - person Kévin Chalet; 20.08.2017
comment
Теперь я понял идею, но моя реализация все еще не работает. Я только что обновил раздел кода в исходном сообщении. Теперь я получаю No authenticationScheme was specified, and there was no DefaultChallengeScheme found ошибку. - person Sam; 20.08.2017
comment
Итак, в моем коде я пытаюсь использовать CookieAuthenticationDefaults.AuthenticationScheme для своей внутренней аутентификации и пытаюсь назвать внешнюю. - person Sam; 20.08.2017
comment
Измените CookieAuthenticationDefaults.AuthenticationScheme на internal_cookie, так как ваш обработчик файлов cookie больше не использует имя по умолчанию. - person Kévin Chalet; 20.08.2017
comment
Кажется, теперь я понял, но, похоже, мне нужно сделать еще кое-что. Я получал пользовательские данные от социальных сетей с помощью var user = HttpContext.User;, которые больше не предоставляют мне никаких данных. Мне нужно как-то указать имя куки из OAuth2, верно? - person Sam; 20.08.2017
comment
Верно. Используйте HttpContext.AuthenticateAsync("external_cookie") для получения утверждений, хранящихся во внешнем файле cookie. - person Kévin Chalet; 20.08.2017
comment
Превосходно! Я не могу отблагодарить вас достаточно. Ты был супер супер полезным. - person Sam; 20.08.2017
comment
@Сэм с удовольствием :) - person Kévin Chalet; 20.08.2017