ASP. NET Ядро, маршрут не запускается, когда определяется как OpenId SignedOutCallbackPath - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть этот контроллер

    [Route("Authentication")]
    public class AuthenticationController : Controller
    {

и это действие

        [HttpGet("SignOut")]
        public async Task<IActionResult> SignOut([FromQuery] string sid)
        {
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectDefaults.AuthenticationScheme);
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme);


            return View();

Это работает, как и ожидалось.

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

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.Cookie.HttpOnly = true;
            })
            .AddOpenIdConnect(options =>
            {
                options.SignedOutCallbackPath = "/Authentication/SignOut";

Разве SignedOutCallbackPath не должен быть моим представлением?

Ответы [ 2 ]

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

Пути обратного вызова в схеме аутентификации OpenID Connect являются внутренними путями, которые используются для потока аутентификации протокола OpenID Connect. Существует три из них:

  • CallbackPath - путь, который провайдер аутентификации отправляет обратно при аутентификации.
  • SignedOutCallbackPath - путь, который провайдер аутентификации отправляет обратно после выхода из системы.
  • RemoteSignOutPath - Путь, который провайдер аутентификации отправляет обратно после удаленного выхода сторонним приложением.

Как вы можете видеть из моего объяснения, это все URL, которые провайдер аутентификации использует: они являются частью потока аутентификации и не должны напрямую использоваться вашими пользователями. Вам также не нужно беспокоиться об обработке этих вещей. Обработчик проверки подлинности OpenID Connect будет автоматически отвечать на эти запросы при запуске промежуточного программного обеспечения для проверки подлинности.

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

У вас просто есть опция , чтобы изменить эти пути, если вы не можете или не хотите использовать значения по умолчанию.

Теперь я могу подумать о двух возможных вещах, которые вы могли бы изменить вместо этого:

  • SignedOutRedirectUri: Это URL-адрес, на который перенаправляется пользователь после завершения процесса выхода. По сути, это позволяет вам отправить пользователя в какое-либо представление, например, с сообщением «вы успешно вышли из системы», чтобы показать, что выход завершен.

    Вы также можете установить это как часть AuthenticationProperties который вы можете передать на SignOutAsync.

  • CookieAuthenticationOptions.LogoutPath: это URL-адрес, настроенный для фактического URL-адреса, который пользователи могут go выйти из применение. Это, на самом деле, не имеет такого большого эффекта.

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

0 голосов
/ 13 февраля 2020

Ваше действие ожидает параметр, который не передан вашим обратным вызовом, этот параметр, по-видимому, также не используется в действии, поэтому вы можете либо пропустить параметр, либо сделать его необязательным

[HttpGet("SignOut")]
public async Task<IActionResult> SignOut()
{
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectDefaults.AuthenticationScheme);
            await ControllerContext.HttpContext.SignOutAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationDefaults.AuthenticationScheme);

            return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...