Проверка подлинности Dotnet Core 3 MVC в Core API - PullRequest
0 голосов
/ 03 октября 2019

Два отдельных проекта, оба DotNet Core 3: API и Web MVC.
MVC и мобильное приложение взаимодействуют только с API.

MVC необходимо аутентифицировать пользователя в API (итакже иметь возможность иметь аутентификацию Google, передавая API), это делается с помощью страницы входа в систему, которая отправляет / account / login / на mvc, которая затем открывает запрос httpclient к API, который возвращает токен JWT. API будет использовать JWT для всех дальнейших действий из веб-приложения MVC.

К сожалению, большая часть документации посвящена только API-возвратным токенам или использованию инфраструктуры SPA для аутентификации. Я смотрю на использование MVC в качестве клиента.

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

API Auth Controller / Auth /

public IActionResult Post()
        {
            //Do auth check here
            if (Request.Form["username"] == "test@test.com" && Request.Form["password"] == "test")
            {

                var authClaims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.Sub, "testUsername"),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                    new Claim(ClaimTypes.NameIdentifier, "ID"),
                    new Claim("Name", "testName"),
                    new Claim("Email", "testEmail"),
                };

                var authSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes("qwertyuiopasdfghjklzxcvbnm123456"));

                var token = new JwtSecurityToken(
                    issuer: "https://localhost",
                    audience: "https://localhost",
                    expires: DateTime.Now.AddHours(3),
                    claims: authClaims,
                    signingCredentials: new Microsoft.IdentityModel.Tokens.SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256)
                    );

                return Ok(new
                {
                    token = new JwtSecurityTokenHandler().WriteToken(token),
                    expiration = token.ValidTo
                });
            }
            return Unauthorized();
        }

Действие / account / login для публикации на MVC

            var httpClient = _httpClientFactory.CreateClient("API");

            var formContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("username", username),
                new KeyValuePair<string, string>("password", password)
            });
            var response = await httpClient.PostAsync("https://localhost:{port}/auth", formContent);


            if (response.IsSuccessStatusCode)
            {


                var tokenResponse = await response.Content.ReadAsStringAsync();
                var json = JsonDocument.Parse(tokenResponse);

                var token = json.RootElement.GetProperty("token").GetRawText(); 
                var expires = json.RootElement.GetProperty("expiration").GetRawText(); 

                var jwt = new JwtSecurityToken(token);
                //Access claims from jwt here, set the identity claims

                //Set cookie authentication for MVC
                var iden = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
                var principal = new ClaimsPrincipal(iden);
                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
                //Redirect to account page
             }

Возвращен токенправильно из API, но дает «имеет три сегмента, но не в надлежащем формате JWS». ошибка в "var jwt = new JwtSecurityToken (token);"шаг.

Я делаю это неправильно? Должен ли я использовать javascript с формой входа в систему, чтобы отправить в API напрямую, добавили ли JWT в заголовки и переключили MVC на аутентификацию JwtBearer?

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