Получить Identity Token при ручном входе в неявный поток (IdentityServer4) - PullRequest
0 голосов
/ 07 мая 2018

Я установил идентификационный сервер 4. Я настроил клиента, используя приведенный ниже ручной пример . Вот код.

        public async Task<IActionResult> Contact()
        {
            if (User.Identity.IsAuthenticated) return View();

            return await StartAuthentication();
        }

        private async Task<IActionResult> StartAuthentication()
        {
            // read discovery document to find authorize endpoint
            var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

            var authorizeUrl = new RequestUrl(disco.AuthorizeEndpoint).CreateAuthorizeUrl(
                clientId: "mvc",
                responseType: "id_token",
                scope: "openid profile",
                redirectUri: "http://localhost:5002/home/callback",
                state: "random_state",
                nonce: "random_nonce",
                responseMode: "form_post");

            return Redirect(authorizeUrl);
        }

        public async Task<IActionResult> Callback()
        {
            var state = Request.Form["state"].FirstOrDefault();
            var idToken = Request.Form["id_token"].FirstOrDefault();
            var error = Request.Form["error"].FirstOrDefault();

            if (!string.IsNullOrEmpty(error)) throw new Exception(error);
            if (!string.Equals(state, "random_state")) throw new Exception("invalid state");

            var user = await ValidateIdentityToken(idToken);

            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user);
            return Redirect("/home/contact");
        }


        public async Task<IActionResult> Logout()
        {
            //await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            //var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

            //return Redirect(disco.EndSessionEndpoint);

            var idToken = (await HttpContext.GetTokenAsync(CookieAuthenticationDefaults.AuthenticationScheme, "id_token"));
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
            var endSessionUrl = new RequestUrl(disco.EndSessionEndpoint).CreateEndSessionUrl(
                    postLogoutRedirectUri: "http://localhost:5002/signout-callback-oidc",
                    idTokenHint: idToken

                );

            return Redirect(endSessionUrl);
        }

В настоящее время

var idToken = (await HttpContext.GetTokenAsync(CookieAuthenticationDefaults.AuthenticationScheme, "id_token"));

равно нулю.

Если я изменю код на

        [Authorize]
        public async Task<IActionResult> Contact()
        {
            if (User.Identity.IsAuthenticated) return View();

            return await StartAuthentication();
        }

В основном он пропускает ручной метод и автоматически перенаправляет на основе конфигурации при запуске. Тогда значение НЕ НУЛЬ

Я также пробовал:

        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties(new Dictionary<string, string>()
        {
            [OpenIdConnectParameterNames.IdToken] = idToken
        }));

без удачи.

Код запуска выглядит следующим образом:

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
        .AddCookie("Cookies")
        .AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = "Cookies";

            options.Authority = "http://localhost:5000";
            options.RequireHttpsMetadata = false;

            options.ClientId = "mvc";
            options.SaveTokens = true;
        });

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Неявный поток возвращает токен как фрагмент, а не как параметры запроса. Вы можете включить response_mode = form_post в параметр запроса, чтобы заставить OP возвращать токен в качестве параметра отправки формы, если OP поддерживает режим ответа формы, http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html.

0 голосов
/ 07 мая 2018

Я добавил этот кусок кода

            var authenticationProperties = new AuthenticationProperties();
            var tokens = new List<AuthenticationToken>();
            tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.IdToken, Value = idToken });
            authenticationProperties.StoreTokens(tokens);
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, authenticationProperties);

Прочитав код безопасности asp.net, я нашел здесь

Кажется, сделал трюк.

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