Ogoun
@Ogoun
Programmer

В чем может быть причина, что не работает аутентификация через Cookies в asp.net?

Пытаюсь реализовать простейшую аутентификацию на основе 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 в различных браузерах.
  • Вопрос задан
  • 277 просмотров
Решения вопроса 1
Jeer
@Jeer
уверенный пользователь
Привет,
На вид подключено правильно.
Оставьте app.UseAuthorization(); и добавьте обычный метод рядом с фильтром [Authorization]
Если он работает, то это дает гарантии, что подключено правильно )
Попробуйте переставить блоки UseAuthentication и UseAuthorization поставить до или после UseStaticFiles, порядок может играть роль
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы