.Net Core Identity 2 Provider login Отмена приводит к необработанному исключению

Я добавил LinkedIn в качестве провайдера. Я без проблем ввел логин и зарегистрировался в LinkedIn. В случае использования, когда пользователь CANCELS изнутри страниц провайдера (либо при входе в систему, либо отменяет авторизацию приложения), промежуточное ПО для идентификации, по-видимому, генерирует необработанное исключение:

При обработке запроса возникло необработанное исключение.
Исключение: user_cancelled_login; Описание = Пользователь отменил вход в LinkedIn
Неизвестное местоположение

Исключение: произошла ошибка при обработке удаленного входа в систему.

Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync ()

System.Exception: user_cancelled_login; Описание = Пользователь отменил вход в LinkedIn

Исключение: произошла ошибка при обработке удаленного входа в систему.

Настройка провайдера при запуске определяет обратный вызов:

services.AddAuthentication().AddOAuth("LinkedIn", "LinkedIn", c =>
        {
            c.ClientId = Configuration["Authentication:LinkedIn:ClientId"];
            c.ClientSecret = Configuration["Authentication:LinkedIn:ClientSecret"];
            c.Scope.Add("r_basicprofile");
            c.Scope.Add("r_emailaddress");
            c.CallbackPath = "/signin-linkedin";
....

И, как я уже сказал, промежуточное ПО, похоже, обрабатывает ВСЕ другие случаи, кроме случаев, когда пользователь отменяет на страницах LinkedIn. URL возврата из LinkedIn выглядит правильно:

https://локальный:44372/зарегистрировались-LinkedInошибка=user_cancelled_login&error_description=+пользователь+отменили+LinkedIn+Войтиисостояние=CfDJ8MA7iQUuXmhBuZKmyWK9xeAgBBkQvnhf1akLhCIn9bsajCPUf7Wg22oeZBH9jZOIY3YrchMSWZ4dH7NQ1UngLKEuqgU-IHfBglbgJDtS-wc4Z-6DnW66uR0G1ubvNVqatFJHYv17pgqZT98suVkvKgihcJdbNEw7b1ThkuFbn9-5EcYhQ5ln6ImoTgthT8io1DOcCfc_-nBVfOa93a6CpUJTsZc9w93i70jn5dKKXSLntZe0VyRSA0r0PKc5spu5En-0R1rxiLjsjo4dy89PV3A

Но никогда не попадает в мой метод контроллера ExternalCallback, где обрабатываются другие случаи, такие как успешный вход в систему / авторизация ??

Мне интересно, работает ли это для кого-нибудь еще с поставщиками сторонних услуг?


person billy jean    schedule 19.06.2018    source источник


Ответы (2)


Существует проблема Github, в которой более подробно объясняется, что здесь происходит, с небольшой информацией. что касается почему это происходит и даже указание на то, что это не будет исправлено:

Обработка события RemoteFailure - правильное решение. Мы должны обновить наши документы / образцы, чтобы показать, как обрабатывать это событие, и, по крайней мере, показать пользователю более подходящее сообщение. Образец страницы с ошибкой может включать ссылку, позволяющую пользователю попытаться снова войти в систему.

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

Обходной путь для этого (как указано выше) - обработать событие RemoteFailure:

services.AddAuthentication().AddOAuth("LinkedIn", "LinkedIn", c => {
    // ...
    c.Events.OnRemoteFailure = ctx =>
    {
        // React to the error here. See the notes below.
        return Task.CompletedTask;
    }
    // ...
});

ctx является экземпляром RemoteFailureContext, который включает _ 3_, описывающее, что пошло не так. ctx также содержит HttpContext, позволяющее выполнять перенаправления и т. Д. В ответ на такие исключения.

person Kirk Larkin    schedule 20.06.2018

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

services.AddAuthentication().AddOAuth("LinkedIn", "LinkedIn", c =>
{
    ...
    c.Events = new OAuthEvents()
    {
        OnRemoteFailure = (context) =>
        {
            context.Response.Redirect(context.Properties.GetString("returnUrl"));
            context.HandleResponse();
            return Task.CompletedTask;
        }
    };
};
person Chris Peacock    schedule 15.02.2019