Два отдельных проекта, оба 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?