Автоматическое перенаправление на внешние права доступа, когда пользователь не авторизован с использованием ASP.NET Core 2.2 и OIDC - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь защитить свое веб-приложение ASP.NET MVC с помощью внешнего сервера авторизации по протоколу OpenID Connect (в частности - KeyCloak, но я думаю, что это не так важно).
Все примеры, которые мне нужно найти,в основном для установки Microsoft.AspNetCore.Authentication.OpenIdConnect пакета nuget и добавления некоторого кода конфигурации в класс запуска:

services
    .AddAuthentication()
    .AddOpenIdConnect(options =>
    {
        options.Authority = authUrl;
        options.ClientId = clientId;
        options.ClientSecret = clientSecret;
        options.ResponseType = OpenIdConnectResponseType.Code;
    });  

Затем, если я добавлю атрибут [Authorized] к действию контроллера, когда я попытаюсь открыть страницу, ябыть перенаправленным на системную страницу /Identity/Account/Login, где в разделе Use another service to log in. появляется кнопка OpenIdConnect для входа через удаленный сервер аутентификации.

Эта кнопка работает - она ​​перенаправляет на сервер авторизации, и после успешного входа в систему открывается /Identity/Account/ExternalLogin с предложением заполнить пропущенные заявки пользователя для локальной регистрации (в частности - электронной почты).
ВНа самом деле, конечно, сначала открывается адрес /signin-oidc, который, как мне кажется, завершает процедуру аутентификации на основе полученного кода авторизации.

Однако мне не нужны никакие другие методы авторизации, кроме OpenIDConnect,Мне нужно, чтобы неавторизованный пользователь был немедленно перенаправлен на удаленный сервер авторизации.

Как я могу предотвратить другие методы входа и перенаправить напрямую на сервер авторизации, но не на страницу входа ASP.NET?

1 Ответ

0 голосов
/ 26 февраля 2019

Однако мне не нужны никакие другие методы авторизации, кроме OpenIDConnect.Мне нужно, чтобы неавторизованный пользователь был немедленно перенаправлен на удаленный сервер авторизации.

Как я могу предотвратить другие способы входа и перенаправить напрямую на сервер авторизации, но не на страницу входа ASP.NET?

Действительно, есть способ перенаправить на сервер авторизации напрямую, не обращаясь к какой-либо локальной странице входа.

Но обычно нам все еще нужен еще SignInScheme. Если вы посмотрите на исходный код, вы обнаружите, что, когда обработчику удаленной аутентификации удастся аутентифицировать какого-либо пользователя, он подпишет пользователя в:

   // ...
   await Context.SignInAsync(SignInScheme, ticketContext.Principal, ticketContext.Properties);
   // ...

Например, если аутентификация OAuth2.0 прошла успешно, мы должны установить файл cookie или выдать токен JWT для текущего пользователя.


Что касается вашего вопроса, самый простой способ - зарегистрировать схему cookie в Challenge / Signin:

services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie()
    .AddOpenIdConnect("MyOIDC", options =>
    {
        // ...
    }

И теперь вы можете использовать [Authorize] по своему усмотрению.Приведенный выше код работает без нареканий для меня без ASP.NET Core Identity

[Update] : Извините, я забыл упомянуть, что мы должны настроить процесс вызова:

  1. Подход 1: настроить схему прямого вызова для Cookie:
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie(options =>{
        options.ForwardChallenge ="MyOIDC";

    })
    .AddOpenIdConnect("MyOIDC", options =>
    {
         // ....
    }
Подход 2: вызвать схему вызова вручную:
    public class AccountController : Controller
    {
        public async Task Login(string returnUrl = "/")
        {
            await HttpContext.ChallengeAsync("MyOIDC", new AuthenticationProperties() { RedirectUri = returnUrl });
        }

        // if you need sign out the MyOIDC service, you could sign out the user for two schemes as below :
        [Authorize]
        public async Task Logout()
        {
            await HttpContext.SignOutAsync("MyOIDC", new AuthenticationProperties
            {
                RedirectUri = Url.Action("Index", "Home")
            });
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
...