Я пытаюсь реализовать промежуточное ПО OpenId Connect в приложении ASP.NET MVC 5 (.Net Framework).
В моем AccountController.cs
я отправляю входной запрос OpenID Connect.У меня реализовано другое промежуточное ПО OpenId Connect, поэтому я указываю, что промежуточное ПО, с которым я хочу бороться, называется «AlternateIdentityProvider».
public void SignIn()
{
HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = "/" },
"AlternateIdentityProvider");
}
При вызове промежуточного ПО событие RedirectToIdentityProvider
в Startup.cs
срабатывает, и я перенаправлен к провайдеру для входа. Однако после успешного входа я перенаправлен на указанный URI перенаправления с параметрами состояния и кода, добавленными в качестве параметров запроса, т.е. http://localhost:63242/singin-oidc/?state=State&code=AuthorizationCode (параметры для краткости удалены), что приводит к 404, так как в моем приложении такого маршрута не существует.
Вместо этого я ожидал, что успешный вход вызовет событие AuthorizationCodeReceived
, где я могу реализовать свою дополнительную логику.На самом деле ни одно из других событий не сработало.
Я реализовал практически идентичное решение в ASP.Net Core 2.1, и здесь я могу пошагово просматривать различные события по мере их запуска.
Соответствующий код моего текущего Startup.cs
показан ниже.Обратите внимание, что поставщик OpenId выдает ошибку, если исходный запрос включает reponse_mode и некоторые параметры телеметрии, поэтому они удаляются во время начального события RedirectToIdentityProvider
.
Любые идеи, почему не выбирается обратный вызов от поставщика OpenIdв промежуточном программном обеспечении?
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions("AlternateIdentityProvider")
{
ClientId = { { Client Id } },
ClientSecret = { { Client Secret } },
Scope = OpenIdConnectScope.OpenId,
ResponseType = OpenIdConnectResponseType.Code,
RedirectUri = "http://localhost:63242/singin-oidc",
MetadataAddress = { { Discovery document url } },
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = context =>
{
Debug.WriteLine("Redirecting to identity provider for sign in..");
context.ProtocolMessage.EnableTelemetryParameters = false;
context.ProtocolMessage.ResponseMode = null;
return Task.FromResult(0);
},
AuthorizationCodeReceived = context => {
Debug.WriteLine("Authorization code received..");
return Task.FromResult(0);
},
SecurityTokenReceived = context =>
{
Debug.WriteLine("Token response received..");
return Task.FromResult(0);
},
SecurityTokenValidated = context =>
{
Debug.WriteLine("Token validated..");
return Task.FromResult(0);
},
}
});