Nano Hash - криптовалюты, майнинг, программирование

Идентификационный сервер 4 после выхода из системы URL-адрес Null

У меня возникают некоторые проблемы, пытаясь понять, как заставить работать URL-адрес выхода из системы в моем приложении ASP.NET Core MVC. Я следил за примерами из документации Identity Server и других сообщений, хотя не совсем уверен, где я ошибаюсь. Пользователь успешно вышел из приложения, затем перенаправлен на Identity Server и вышел оттуда, но я заметил, что параметр id_token не передается на Identity Server, поэтому даже несмотря на то, что параметр post logout присутствует, он не используется.

Конфигурация моего промежуточного программного обеспечения выглядит правильно, я считаю, что это проблема с тем, как я создаю файл cookie приложения, и токен на самом деле не сохраняется в любом месте, где его можно было бы повторно использовать.

В настоящее время я использую только тип ответа кода, но, похоже, он также включает токен идентификации вместе с токеном авторизации.

Startup.cs:

services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = "oidc";
            })
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
                options.RequireHttpsMetadata = false;
                options.Audience = Configuration["IdentityServerSettings:Audience"];
            })
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddOpenIdConnect("oidc", options =>
            {
                options.Authority = Configuration["IdentityServerSettings:AuthorityUrl"];
                options.ClientId = "myClient";
                options.RequireHttpsMetadata = false;
                options.SaveTokens = true;
                options.SignedOutRedirectUri = "http://localhost:55690/account/logoutcallback";
                options.SignedOutCallbackPath = "/account/logoutcallback";
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            });

AccountController.cs

Способы выхода:

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

    public async Task<IActionResult> LogoutCallback()
    {
        return RedirectToAction(nameof(Dashboard), "Account");
    }

Обратный звонок при входе:

if (!Request.Query.ContainsKey("code"))
                throw new Exception($"Request query string does not contain an authorization code. Query string: {Request.QueryString.Value}");

            var authCode = Request.Query["code"].ToString();

            TokenResponse tokenResponse = null;
            using (var httpClient = new HttpClient())
            {
                tokenResponse = await httpClient.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
                {
                    Address = _configuration["IdentityServerDashboardSettings:TokenUrl"],
                    ClientId = _configuration["IdentityServerDashboardSettings:ClientId"],
                    RedirectUri = _configuration["IdentityServerDashboardSettings:RedirectUrl"],
                    Code = authCode
                });
            }

            var handler = new JwtSecurityTokenHandler();
            var jwtToken = handler.ReadToken(tokenResponse.AccessToken) as JwtSecurityToken;

            var identity = new ClaimsIdentity(jwtToken.Claims, CookieAuthenticationDefaults.AuthenticationScheme);
            identity.AddClaim(new Claim("id_token", tokenResponse.IdentityToken));

            var claimsPrinciple = new ClaimsPrincipal();
            claimsPrinciple.AddIdentity(identity);

            await HttpContext.SignInAsync(claimsPrinciple);

            return RedirectToAction(nameof(Dashboard), "Account");

Все остальное работает нормально, SignOutResult успешно создает URL-адрес выхода и перенаправляет на сервер идентификации, но в параметрах отсутствует id_token. Я действительно не могу найти никаких примеров того, как я должен хранить это для дальнейшего использования, многие примеры, с которыми я столкнулся, похоже, просто работают автоматически. Я что-то настроил неправильно?


  • вы хотите иметь собственный путь перенаправления выхода из системы? 14.07.2020
  • Да, я более или менее просто хочу перенаправить пользователя обратно в приложение и на страницу учетной записи, где они могут снова войти в систему, но в настоящее время после выхода они просто остаются на странице Identity Server. 15.07.2020
  • Понятно, оставил ответ, так как это было так долго до комментария 15.07.2020

Ответы:


1

Чтобы перенаправить обратно на клиент MVC, внесите следующие изменения:

  1. Измените PostLogoutRedirectUris в конфигурации клиента в IdentityServer следующим образом:
PostLogoutRedirectUris = { "http://localhost:55690/signout-callback-oidc"

  1. При настройке подключения OpenId клиента MVC удалите SignedOutRedirectUri и SignedOutCallbackPath

Значение по умолчанию для AccountOptions - AutomaticRedirectAfterSignOut - false, и вы можете увидеть страницу, подобную изображению ниже, с просьбой щелкнуть here, чтобы вернуться к клиенту mvc:

введите описание изображения здесь

для автоматического перенаправления вы можете установить AccountOptions - AutomaticRedirectAfterSignOut в значение true в проекте IdentityServer.

Вот образец Я сделал сам.

15.07.2020
  • Спасибо, это решило часть моей проблемы. Я также узнал, что, поскольку мы размещаем наш собственный экземпляр Identity Server, кто-то также отключил логику автоматического перенаправления в самом Identity Server, поэтому после восстановления он теперь успешно работает и решил другую часть. 30.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..