Страница входа в систему IdentityServer4 бесконечно перенаправляет на страницу входа - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь реализовать пользовательскую кнопку «Вход» в моем приложении MVC, которая будет перенаправлять на IdentityServer для входа в систему, а затем перенаправлять обратно в мое приложение MVC.

Для этого я использую метод расширения Microsoft.AspNetCore.Authentication.ChallengeAsync на HttpContext в своем действии Account/Login

public Task Login()
{
    return HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme);
}

Запрос направлен на конечную точку авторизации в IDPпользователь может войти в систему, и запрос перенаправляется на signin-oidc в моем приложении MVC.Именно в этот момент signin-oidc вызывает действие Account/Login и начинает бесконечный цикл.

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:4500/Account/Login
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method Moneteer.Landing.Controllers.AccountController.Login (Moneteer.Landing) with arguments ((null)) - ModelState is Valid
info: Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler[12]
      AuthenticationScheme: OpenIdConnect was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action Moneteer.Landing.Controllers.AccountController.Login (Moneteer.Landing) in 11.9704ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 23.4211ms 302
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST https://localhost:4500/signin-oidc application/x-www-form-urlencoded 1488
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[10]
      AuthenticationScheme: Cookies signed in.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 10.4219ms 302
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:4500/Account/Login
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method Moneteer.Landing.Controllers.AccountController.Login (Moneteer.Landing) with arguments ((null)) - ModelState is Valid

Я предполагаю, что signin-oidc не может сохранить cookie и предполагает, что вход в систему был неудачным.Соответствующая конфигурация для приложения MVC выглядит следующим образом:

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

    options.Authority = Constants.Authority;
    options.RequireHttpsMetadata = true;

    options.ClientId = "moneteer-mvc";

    options.SaveTokens = true;
});

В IDP клиент регистрируется следующим образом:

new Client
{
    ClientId = "moneteer-mvc",
    ClientName = "MVC Client",
    AllowedGrantTypes = GrantTypes.Implicit,
    RequireConsent = false,

    RedirectUris = { "https://localhost:4500/signin-oidc" },
    PostLogoutRedirectUris = { "https://localhost:4500/signout-callback-oidc" },

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
    },
}

Как можно заставить этот поток работать с ChallengeAsyncправильно?

1 Ответ

0 голосов
/ 21 мая 2018

Всем, кто смотрит на это в будущем: существует перегрузка ChallengeAsync, которая позволяет вам передать redirectUrl, который вы хотите, чтобы signin-oidc отправлял пользователя после успешного входа в систему.Как только это установлено, бесконечное перенаправление не происходит.

return HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties
{
    RedirectUri = "/",
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...