Когда пользователь запускает поток, 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));
}
}
Код: Выделить всё
feature.Session = _sessionStore.Create(sessionKey, _options.IdleTimeout, _options.IOTimeout, tryEstablishSession, isNewSessionKey);
PS: я записываю некоторые значения в сеанс сразу после его инициализации, поэтому это не так. пусто
Мои 2 вопроса:
- Почему sessionStore.Create возвращает объект с новым sessionId каждый раз?
- Есть ли другой способ достичь основной цели - поддерживать сеанс с использованием sessionId значение в теле запроса?
Подробнее здесь: https://stackoverflow.com/questions/792 ... net-core-8
Мобильная версия