NikFaraday
@NikFaraday
Student full-stack Developer

Как настроить web api для передачи куков с React клиента?

Изучаю сессии на asp.net core web api, пытаюсь сделать авторизацию с React клиента. Сессию тестировал через Postman, после авторизации сохраняется кука сессии и передаётся при запросе, после чего данные доступны внутри HttpContext.Session

Теперь пытаюсь сделать такое же через React. В общем, вот настройка CORS:
services.AddCors(options =>
{
    options.AddDefaultPolicy(policy => policy
        .WithOrigins("http://localhost:3000", "https://localhost:3000")
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials());
});


Настройка сессии:
services.AddDistributedSqlServerCache(config =>
{
    config.ConnectionString = connectionString;
    config.SchemaName = "dbo";
    config.TableName = "Sessions";
});

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(15);
    options.IOTimeout = TimeSpan.FromHours(6);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});


Вот запрос клиента:
let data = {
            login: login,
            password: password
        }
        let jsonData : string = JSON.stringify(data)

        let response = await fetch('https://localhost:7262/api/authentication/sign-in', {
            method: 'post',
            body: jsonData,
            headers: {
                'Content-Type': 'application/json'
            },
            credentials: 'include',
            mode: 'cors'
        })


Проверка авторизации при запросе делается при помощи аттрибута проверка авторизации:
internal sealed class SessionAuthorizeAttribute : Attribute, IAsyncAuthorizationFilter
{
    private const string SESSION_KEY_NAME = "Id";

    public Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        ISessionManager manager = context.HttpContext.RequestServices.GetRequiredService<ISessionManager>();

        Result<string> authResult = manager.Get(SESSION_KEY_NAME);
        if (authResult.ErrorMessages.Any())
        {
            context.Result = new UnauthorizedResult();
            return Task.CompletedTask;
        }

        context.HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity(
            [new Claim(SESSION_KEY_NAME, authResult.Value)]
        ));

        return Task.CompletedTask;
    }
}


Реализация метода получения указанного значения из сессии:
public class SessionManager : ISessionManager
{
    private readonly HttpContext _httpContext;
    private readonly ICacheManager _cacheManager;

    public SessionManager(IHttpContextAccessor contextAccessor,
        ICacheManager cacheManager)
    {
        _httpContext = contextAccessor.HttpContext;
        _cacheManager = cacheManager;
    }

   public Result<string> Get(string key)
   {
       if (!_httpContext.Session.TryGetValue(key, out byte[] byteValue))
       {
           return Result<string>.Error(AuthorizedError);
       }
       return Result<string>.Success(Encoding.UTF8.GetString(byteValue));
   }
}


Сам SessionManager зарегистрирован как AddScoped.

Сам процесс авторизации происходит успешно и устанавливается куку сессии, но при запросе на защищённый SessionAuthorizeAttribute аттрибутом не могу получать куку этой сессии. К сведению, сервер работает на https, а клиента на http. В чём может быть проблема?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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