Я использую .NET Core 2.1
и пытаюсь использовать Session как часть аутентификации. Я ожидаю, что это произойдет:
- человек входит
- Я установил значение сеанса
- Сеансовый cookie возвращается
- человек клик выйти из системы
- Я очищаю сессию к
HttpContext.Session.Clear()
Затем я пытаюсь имитировать ситуацию, когда cookie-файл Session был украден у исходного пользователя, поэтому я создаю еще один запрос к серверу и ожидаю, что значение, установленное в сеансе, там не будет. Похоже, он все еще держит его даже после вызова Session.Clear()
.
Код:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(10);
options.Cookie.Name = SessionCookieName;
options.Cookie.HttpOnly = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseSession();
}
Действие входа:
HttpContext.Session.SetInt32(SessionConstants.Key, value);
Действие выхода из системы:
HttpContext.Session.Clear();
Действие CheckLoginStatus:
var sessionValue = HttpContext.Session.GetInt32(SessionConstants.Key);
Тест, который решает проблему:
var httpClientGenuineRequest = GetClient();
var httpClientAttacker = GetClient();
//Given
var request = new LoginRequest()
{
//filled properties
};
var loginResponse = await httpClientGenuineMember.PostAsync("urlToLoginAction", new JsonContent(request));
AddResponseCookiesToHeaders(httpClientAttacker, loginResponse);
await httpClientGenuineMember.PostAsync("urlToLogoutAction", new JsonContent(request));
//When
var response = await httpClientAttacker.GetAsync("urlToCheckStatusAction");
//Here the actual result is true
var actualResult = response.GetResult<bool>();
//Then
var expectedResult = false;
Приведенный выше пример не полный. Вопрос касается только значений Session, поэтому я избавился от всего другого кода аутентификации, чтобы сделать его более понятным.
Мне кажется, HttpContext.Session.Clear
не очищает сеанс или значение сохраняется в Cookie сеанса (что не имеет никакого смысла)?
Также, когда я отлаживаю и проверяю значение Session для моего ключа, сразу после Clear()
, это дает мне значение null. Но когда я передаю Session cookie и пытаюсь прочитать значение, оно снова появляется.
Очевидно, что когда Idle Timeout
заканчивается, код ведет себя как ожидалось. В то время это звучит как угроза безопасности.
Буду признателен за любую помощь.
EDIT:
Согласно комментарию под постом, я попытался добавить к нему сеанс Redis:
services.AddDistributedRedisCache(setup =>
{
setup.Configuration = "urlToRedisInstance";
setup.InstanceName = "MySessionStateStore2";
});
но поведение точно такое же.