Вопрос:

Клиент MVC, использующий Open Id Connect, автоматический вход в систему после выхода из системы

asp.net-mvc asp.net-core openid-connect identityserver4

958 просмотра

2 ответа

92 Репутация автора

Я только что создал свое первое приложение MVC, используя Open Id Connect Protocol под Identity Server 4 и .Net Core 2.0. Приложение работает должным образом в процессе входа в систему, когда пользователь перенаправляется на форму входа в систему, размещенную в моей службе Identity Server.

В настоящее время у меня возникает проблема, заключающаяся в том, что после прохождения потока выхода из системы приложение «кажется» ведет себя так, как ожидалось, и показывает, что пользователь вышел из системы / не прошел проверку подлинности.

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

Я использовал Implicit MVC Client из Identity Server Samples, чтобы исключить любой мой клиентский код, но происходит то же самое.

Мне было интересно, сталкивался ли кто-нибудь с этой проблемой и как им удалось ее решить.

Мой Startup.cs в клиенте выглядит так:

services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie(options =>
            {
                options.Cookie.Name = "mvcimplicit";
            })
            .AddOpenIdConnect("oidc", options =>
            {
                options.Authority = Constants.Authority;
                options.RequireHttpsMetadata = false;

                options.ClientId = "lipaspotwebui";

                options.Scope.Clear();
                options.Scope.Add("openid");
                options.Scope.Add("profile");
                //options.Scope.Add("email");
                options.AuthenticationMethod = OpenIdConnectRedirectBehavior.FormPost;

                options.SaveTokens = true;

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = JwtClaimTypes.Name,
                    RoleClaimType = JwtClaimTypes.Role,
                };
            });

Вот код из моего метода Logout в моем клиентском приложении:

public async Task<IActionResult> Logout()
    {            
        return new SignOutResult(new string[] { "oidc", "Cookies" });
    }

Из моих исследований выяснилось, что пользовательские данные каким-то образом кэшируются на клиенте и передаются при вызове Identity Server, но это только предположение.

Любая помощь по этому вопросу будет высоко ценится.

Стюарт

Редактировать:

Теперь я подтвердил, что проблема заключается в файле cookie .AspNet.Identity.Application, который создается в процессе входа в приложение. Вопрос, который у меня есть сейчас, заключается в том, как избавиться от этого, поскольку я попробовал приведенные ниже предложения безрезультатно. Есть ли способ легко избавиться от этого в моем действии CleanUp?

Редактировать № 2

Как и предполагалось, перед началом работы я очистил все куки браузера. Вот печенье на каждом этапе

После первоначального входа

Список файлов cookie после входа

После выхода из системы (перенаправлено с Identity Server 4)

Список файлов cookie после выхода из системы

После доступа к защищенному методу на сайте клиента

Список файлов cookie после доступа к защищенному методу

Важно отметить, что, как уже упоминалось выше, когда я получаю доступ к защищенному методу после завершения выхода из системы, мне не предлагается снова вводить имя пользователя и пароль, какой IMO не может быть желательным методом для работы этой системы.

Автор: Stuart Ferguson Источник Размещён: 04.01.2018 04:58

Ответы (2)


0 плюса

1852 Репутация автора

Вы должны иметь это:

Request.GetOwinContext().Authentication.SignOut();

в вашем методе выхода из системы в клиенте. Затем LogoutUri клиента (зарегистрированного в IDS) должен указывать на метод в вашем клиенте (например: https: // clientUrl / Home / SignoutCleanup ), в котором есть следующее:

public void SignoutCleanup(string sid)
    {
        var cp = (ClaimsPrincipal)User;
        var sidClaim = cp.FindFirst("sid");
        if (sidClaim != null && sidClaim.Value == sid)
        {
            Request.GetOwinContext().Authentication.SignOut("Cookies");
        }
    }

Пока что это работает для нас как шарм.

РЕДАКТИРОВАТЬ: Для клиентов .NET Core, потому что нет Request.GetOwinContext ()

Вы должны использовать:

Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.SignOutAsync(HttpContext);

Вы можете увидеть другие ответы, сказав, что вы также можете использовать:

HttpContext.Authentication.SignOutAsync("Cookies");

Но он уже устарел и будет удален.

Автор: m3n7alsnak3 Размещён: 04.01.2018 06:03

0 плюса

5851 Репутация автора

Как уже упоминалось в m3n7alsnak3, HttpContext.Authentication.SignOutAsyncон устарел, но его заменили на HttpContext.SignOutAsync- и вам нужно вызвать его и для OIDC. Попробуй это:

await HttpContext.SignOutAsync("mvcimplicit");
await HttpContext.SignOutAsync("oidc");
Автор: McGuireV10 Размещён: 04.01.2018 07:42
Вопросы из категории :
32x32