Пытаюсь реализовать простейшую аутентификацию на основе Cookies в .NET 6, и код который работал в предыдущих версиях .NET не работает.
Инициализация:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
/*options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.Cookie.SameSite = SameSiteMode.Lax;
options.ExpireTimeSpan = TimeSpan.FromHours(4);
options.SlidingExpiration = true;*/
options.AccessDeniedPath = "/index.html";
options.LoginPath = "/login.html";
});
//***************
//app.UseCookiePolicy();
app.UseAuthentication();
//app.UseAuthorization();
Закомментированы различные вариации которые пробовал использовать. Ниже идет код контроллера для аутентификации, отрабатывает без ошибок:
public class AccountController : Controller
{
private readonly IAuthProvider _authProvider;
public AccountController(IAuthProvider authProvider)
{
if (authProvider == null) throw new ArgumentNullException(nameof(authProvider));
_authProvider = authProvider;
}
[HttpPost("/api/login")]
public async Task<IActionResult> Login(LoginPasswordSignInRequest signInData)
{
if (ModelState.IsValid)
{
var user = _authProvider.Verify(new Dictionary<string, string> { { "username", signInData.Username }, { "password", signInData.Password } });
if (user == null)
{
return Redirect("/index.html");
}
else
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.Role, "operator"));
var principal = new ClaimsPrincipal(identity);
var authProperties = new AuthenticationProperties
{
AllowRefresh = true,
ExpiresUtc = DateTimeOffset.Now.AddDays(1),
IsPersistent = true,
};
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, authProperties);
return LocalRedirect("/editor.html");
}
}
return Redirect("/index.html");
}
public async Task<IActionResult> LogOut()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return LocalRedirect("/index.html");
}
}
Однако, если после этого я пробую вытащить данные из запроса:
context.Context.User?.Identity?.IsAuthenticated
То и пользователь оказывается не аутентифицирован, и Claims пустые. Не могу найти в чем причина. Проект собран без https, проверяю на localhost в различных браузерах.