Сбой промежуточного программного обеспечения OpenID Connect - как отлаживать? - PullRequest
0 голосов
/ 22 ноября 2018

Я установил очень простое приложение ASP.NET MVC 5, которое пытается аутентифицировать пользователя через провайдера OpenID в режиме кода авторизации.

Я могу войти в систему, и сервер возвращает код встрока запроса URL перенаправления и одноразовый cookie.Однако на клиентском приложении пользователь не аутентифицирован (User.Identity.IsAuthenticated false), не имеет претензий и называется контроллером. Действие с атрибутом Authorize никогда не выполняется.Браузер остается на странице URL перенаправления, которая является домашней страницей.

Я думаю, что что-то происходит во время выполнения промежуточного программного обеспечения OpenID Connect, которое останавливает его на полпути, но не может понять, как его отладить.

  • Не выдается никаких исключений даже в режиме «разбить на все исключения CLR».

  • При подключении EventListener к IdentityModelEventSource.Logger на уровне VerboseЯ получаю только одно зарегистрированное событие, которое говорит «Генерация одноразового номера для сообщения openIdConnect» , один раз за попытку аутентификации.

  • Нет Notification перехваты достигнуты, кроме RedirectToIdentityProviderТаким образом, похоже, что код авторизации или токен безопасности не получен, но аутентификация тоже не удалась.

Как я могу получить больше информации о том, что происходит, чтобы я мог отладить мойпроблема?

Вот код:

        public void Configuration(IAppBuilder app)
        {
            var clientSecret = "secret";
            var authenticationOptions = new OpenIdConnectAuthenticationOptions
            {
                ClientId = "id",
                ClientSecret = clientSecret,
                Authority = "https://theauthority",
                RedirectUri = "https://localhost/MyApp/",
            };

            authenticationOptions.ResponseType = OpenIdConnectResponseType.Code; // Authorization code
            authenticationOptions.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(clientSecret));
            authenticationOptions.TokenValidationParameters.RequireSignedTokens = true;
            authenticationOptions.TokenValidationParameters.ValidAudience = "katanaclient";
            authenticationOptions.SignInAsAuthenticationType = "Cookies";
            authenticationOptions.Configuration = new OpenIdConnectConfiguration
            {
                Issuer = "https://theissuer",
                AuthorizationEndpoint = "https://theendpoint",
                TokenEndpoint = "https://theendpoint/api/v1/token",
                UserInfoEndpoint = "https://theendpoint/api/v1/userinfo",
                EndSessionEndpoint = "https://theendpoint/api/v1/logout",
                ScopesSupported = { "openid", "profile"},
            };

            authenticationOptions.Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = async n =>
                {
                    // here it goes
                    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
                    {
                        n.ProtocolMessage.EnableTelemetryParameters = false;
                    }
                },
                AuthorizationCodeReceived = async notification =>
                {
                    // doesn't go through here
                    Debug.WriteLine($"{notification.Response.Body}");

                },
                SecurityTokenReceived = async notification =>
                {
                    // doesn't go through here
                    Debug.WriteLine($"{notification.Response.Body}");
                },
                AuthenticationFailed = async notification =>
                {
                    // doesn't go through here
                    Debug.WriteLine($"{notification.Response.Body}");
                },
                SecurityTokenValidated = async n =>
                {
                    // doesn't go through here
                    Debug.WriteLine($"{n.Response.Body}");
                },
                MessageReceived = async notification =>
                {
                    // doesn't go through here
                    Debug.WriteLine($"{notification.Response.Body}");
                }
            };

            app.UseCookieAuthentication(new CookieAuthenticationOptions()
            );
            app.UseOpenIdConnectAuthentication(authenticationOptions);

            Microsoft.IdentityModel.Logging.IdentityModelEventSource.Logger.LogLevel = EventLevel.Verbose;
            Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;

            var listener = new EventListener();
            listener.EnableEvents(Microsoft.IdentityModel.Logging.IdentityModelEventSource.Logger, EventLevel.LogAlways);
            listener.EventWritten += Listener_EventWritten; // Only thing this ever logs is "generating nonce"
        }

[Edit]

Я обнаружил, что в ASP.NET Core проект с GetClaimsFromUserInfoEndpoint = true работает отлично.Но это свойство, к сожалению, отсутствует в более старой реализации Microsoft.Owin.Security.OpenIdConnect ...

...