Используйте SessionId из тела запроса вместо файла cookie в .NET Core 8.C#

Место общения программистов C#
Ответить
Anonymous
 Используйте SessionId из тела запроса вместо файла cookie в .NET Core 8.

Сообщение Anonymous »

У нас был старый проект, использующий .NET Framework. Это «API с состоянием», где состояние обрабатывается с использованием SessionID, который является одним из полей в теле запроса (json).
Когда пользователь запускает поток, sessionId отсутствует. отправляется, сеанс создается серверной частью и возвращается в ответе, а затем используется в следующих запросах.
Мы добились этого с помощью SessionManager: ISessionIDManager, IHttpModule в рамках .NET, которая определяется как sessionIDManagerType в web.config.
Теперь в .NET 8 я не могу найти ничего похожего на sessionIDManagerType. Сеанс поддерживается путем отправки файла cookie с каждым запросом, и мы не можем использовать этот способ по определенным причинам.
Что я пробовал: согласно некоторым ответам на связанные вопросы, такие как «sessionId обновляется с каждым запросом». ", я попытался подделать файл cookie сеанса в AuthenticationHandler (я знаю, что это не то место, но он запускается до sessionMiddleware, так что...), прочитав sessionId из тела запроса, закодировав его и установив как файл cookie в заголовке запроса: < /p>

Код: Выделить всё

public class MyAuthenticationHandler : AuthenticationHandler {
public IDataProtector _dataProtector;
public MyAuthenticationHandler(IDataProtectionProvider dataProtectionProvider, IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) {
_dataProtector = dataProtectionProvider.CreateProtector(nameof(SessionMiddleware));
}

....

string Protect(IDataProtector protector, string data) {
ArgumentNullException.ThrowIfNull(protector);
if (string.IsNullOrEmpty(data)) {
return data;
}

var userData = Encoding.UTF8.GetBytes(data);

var protectedData = protector.Protect(userData);
return Convert.ToBase64String(protectedData).TrimEnd('=');
}

protected override Task HandleAuthenticateAsync() {
// read json from Body into Dictionary of objects
var data = GetJsonDataIfJson(Request).Result;

if ( data != null && data.ContainsKey("sessionId") ) {
string sessionId = (string)data["sessionId"];

var sessionKey = Protect(_dataProtector, sessionId);
// not the perfect way ,should be better, but cookie is set
this.Context.Request.Headers["Cookie"] = "Test_SessionId=" + sessionKey;
}

....
// always success
return Task.FromResult(AuthenticateResult.Success(ticket));
}
}
Я установил точку останова в SessionMiddleware.cs в Task Invoke (контекст HttpContext) и вижу, что значение cookie успешно прочитано и незащищено, что приводит к действительному sessionKey (тому, который я получил из запроса и установлен в cookie), но несколькими строками позже, в

Код: Выделить всё

feature.Session = _sessionStore.Create(sessionKey, _options.IdleTimeout, _options.IOTimeout, tryEstablishSession, isNewSessionKey);
Хотя sessionKey действителен, isNewSessionKey == false, tryEstablishSession всегда возвращает true, а IdleTimeout составляет несколько часов — Session.SessionId получает новое значение при каждом запросе, а не то, которое я отправил.
PS: я записываю некоторые значения в сеанс сразу после его инициализации, поэтому это не так. пусто
Мои 2 вопроса:
  • Почему sessionStore.Create возвращает объект с новым sessionId каждый раз?
  • Есть ли другой способ достичь основной цели - поддерживать сеанс с использованием sessionId значение в теле запроса?


Подробнее здесь: https://stackoverflow.com/questions/792 ... net-core-8
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»