OWIN Промежуточное программное обеспечение OpenIdConnectAuthentication не вызывается при удалении cookie на клиенте - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над веб-приложением, использующим OpenIdConnectAuthentication с использованием файлов cookie.Приложение основано на WebAPI, но использует OWIN для проверки подлинности, так как оно первоначально использовало проверку подлинности с помощью форм, и мы пытаемся подключить замену с помощью IdentityServer 4. Когда пользователь впервые обращается к приложению, процесс проверки подлинности происходит, как ожидается, и файл cookie проверки подлинности устанавливаетсякак и ожидалось.Если cookie затем удаляется вручную, процесс аутентификации не происходит при обновлении страницы, и в результате мы получаем ошибку (из-за зависимости от идентификатора в конструкции контроллера).Глядя на вывод трассировки, промежуточное программное обеспечение OWIN определенно вызывается в правильном месте в конвейере, поэтому, почему аутентификация cookie не происходит, я не могу.

Отладка промежуточного программного обеспечения, я вижу, что Identity неустановить после того, как промежуточное программное обеспечение OpenIdConnectAuthentication выполнится, поэтому, если не произойдет какое-то странное кэширование, я бы ожидал, что будет запущен процесс аутентификации.

После небольшой задержки обновите страницу во второй раз и она сновааутентифицируется.

Есть идеи?

Вот фрагмент Startup.cs для клиента:

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "cookies",
            AuthenticationMode = AuthenticationMode.Active,
            SlidingExpiration = false,
            CookieHttpOnly = true,
            CookieSecure = CookieSecureOption.Never
        });

        //Implicit Flow
        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = identityServerUrl,
            AuthenticationMode = AuthenticationMode.Active,
            ClientId = appName,
            ResponseType = "id_token token",
            RedirectUri = returnUrl,            // This application 
            Scope = "openid profile username",  // Basic claims plus the custom 'username' claim 
            UseTokenLifetime = false,           // Otherwise cookie lifetime is too short lived
            TokenValidationParameters = new TokenValidationParameters()
            {
                NameClaimType = "username"
            },
            SignInAsAuthenticationType =
                "cookies", //Same as AuthenticationType for provider above (in this case cookies)
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                SecurityTokenValidated = async ctx =>
                {
                    var userInfoClient = new UserInfoClient($"{identityServerUrl}/connect/userinfo");
                    var response = await userInfoClient.GetAsync(ctx.ProtocolMessage.AccessToken);
                    ctx.AuthenticationTicket.Identity.AddClaims(response.Claims);
                    ctx.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", ctx.ProtocolMessage.AccessToken));
                }
            }
        });

        app.UseStageMarker(PipelineStage.Authenticate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...