При входе в систему сервера идентификации запрашивается вызов кода

#identityserver4

Вопрос:

У меня есть 3 проекта

  • Сервер идентификации
  • Приложение MVC
  • Веб-Api

Это прекрасно работает

Приложение MVC: Службы настройки

 services.AddAuthentication(opt =>
{
    opt.DefaultScheme = "Cookies";
    opt.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", opt =>
{
    opt.SignInScheme = "Cookies";
    opt.Authority = "https://localhost:5001";
    opt.ClientId = "mvc";
    opt.ResponseType = "code id_token";
    opt.Scope.Add("openid");
    opt.Scope.Add("email");
    opt.Scope.Add("office");
    opt.ClientSecret = "secret";
    opt.SignInScheme = "Cookies";
    opt.SaveTokens = false;
});
 

И клиент

 new Client
{
    ClientId = "mvc",
    ClientName= "MVC Demo",
    Description = "MVC Demo",
    AllowedGrantTypes = GrantTypes.Implicit,
    RedirectUris = { "https://localhost:44344/signin-oidc" },
    PostLogoutRedirectUris = { "https://localhost:44344/signout-callback-oidc" },
    BackChannelLogoutUri = "https://localhost:44344/signout-oidc",
    FrontChannelLogoutUri = "https://localhost:44344/signout-oidc",
    AllowedScopes = { "openid", "email", "office", "profile" },
}
 

Вход в клиент работает абсолютно нормально, но проблема возникает, когда я хочу добавить гибридный поток (следуя видео Microsoft academy с 2019 года), и он просто не работает. Это дает мне ошибку code challenge required при входе в систему — я пытаюсь обновить его, чтобы он мог вызывать API из приложения MVC

Это то, что я обновляю:

Я добавляю область действия в схему «oidc» и устанавливаю секрет клиента

 opt.Scope.Add("api1");
opt.ClientSecret = "secret";
 

И против клиента я добавляю секрет клиента, добавляю api1 в разрешенные области и обновляю поток до hybrid

 ClientSecrets = { new Secret("secret".Sha256()) },
AllowedScopes = { "openid", "email", "office", "profile", "api1" },
AllowedGrantTypes = GrantTypes.Hybrid,
 

С тех пор, когда я нажимаю «Войти», я получаю это
введите описание изображения здесь

Я провел последние 2 дня, пытаясь понять, чего мне не хватает в этом

Ответ №1:

Проблема в том, что IdentityServer ожидает, что вы используете расширение PKCE, и чтобы отключить его, вы можете установить для параметра RequirePkce значение false. Однако по соображениям безопасности вы должны попытаться использовать эту функцию.

Здесь написано:

RequirePkce Указывает, должны ли клиенты, использующие тип предоставления на основе кода авторизации, отправлять подтверждающий ключ (по умолчанию значение true).

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

В исходном коде здесь говорится::

     /// <summary>
    /// Enables or disables the use of the Proof Key for Code Exchange (PKCE) standard.
    /// This only applies when the <see cref="ResponseType"/> is set to <see cref="OpenIdConnectResponseType.Code"/>.
    /// See https://tools.ietf.org/html/rfc7636.
    /// The default value is `true`.
    /// </summary>
    public bool UsePkce { get; set; } = true;
 

Итак, он отключен для гибридного потока?

Комментарии:

1. Ладно, в этом есть смысл. Что мне нужно обновить, чтобы использовать PKCE? Я совершенно новичок в этом деле. Цель, которую я ищу, — это приложение MVC для установки маркера доступа для приложения API

2. я бы хотел использовать поток кода аутентификации вместо гибридного потока.

3. обновил свой ответ. поэтому я бы отключил его на сервере