Я пытаюсь реализовать пользовательскую кнопку «Вход» в моем приложении 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
правильно?