AuthorizationCodeReceived событие не срабатывает - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь реализовать промежуточное ПО 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);
                },
            }
        });

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Обратите внимание, что реализация OpenId Connect в .Net Framework поддерживает только response_mode = form_post.(См. закрытая проблема GitHub )

Поскольку вы отбрасываете параметр в запросе поставщику OpenId Connect (в своем уведомлении RedirectToIdentityProvider), тогда поставщик по умолчанию будет использовать response_mode = query pr.спецификации(см. связь между response_type и response_mode в specs .)

Итак, промежуточное ПО OpenId Connect ожидает, что придет HTTP POST (с телом формы), и ваш провайдер будет работать правильноотправить HTTP GET (с параметрами в виде строки запроса).

0 голосов
/ 08 января 2019

Я столкнулся с той же проблемой.Я пытаюсь подключить Овина к нашему устаревшему приложению WebForms.

Для меня мне пришлось сделать следующее:

1) Измените манифест приложения определения приложения в Azure, чтобы установить для свойства "oauth2AllowIdTokenImplicitFlow" значение true из false .

  1. Перейдите на портал Azure ,
  2. Выберите Active Directory Azure
  3. Выберите Регистрация приложений
  4. Выберите приложение.
  5. Нажмите Манифест
  6. Найдите значение oauth2AllowIdTokenImplicitFlow и измените его значение на true
  7. Нажмите Сохранить

2) В файле startup.cs измените следующее:

ResponseType = OpenIdConnectResponseType.Code

до

ResponseType = OpenIdConnectResponseType.CodeIdToken

Однажды, ясделал эти две вещи, SecurityTokenValidated и AuthorizationCodeReceived начали срабатывать.

Хотя я не уверен, что этоон правильный путь или нет.Нужно больше читать.

Надеюсь, это поможет.

...