Изучаю сессии на
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
. В чём может быть проблема?