Идентификационный сервер 4 после выхода из системы URL-адрес Null - PullRequest
0 голосов
/ 14 июля 2020

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

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

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

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. Я действительно не могу найти никаких примеров того, как я должен хранить это для дальнейшего использования, многие примеры, с которыми я столкнулся, похоже, просто работают автоматически. Я что-то настроил неправильно?

1 Ответ

0 голосов
/ 15 июля 2020

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

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

В MVC установка подключения OpenId клиента удалить SignedOutRedirectUri и SignedOutCallbackPath

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

enter image description here

for automatic redirect you can set AccountOptions - AutomaticRedirectAfterSignOut to true on IdentityServer project.

Здесь - образец, который я сделал сам.

...