Каков стандартный способ поддержания стабильной пользовательской сессии? - PullRequest
1 голос
/ 12 декабря 2010

Каков стандартный способ поддерживать стабильный пользовательский сеанс в ASP.NET, не беспокоясь о перезапусках IIS, отключенных пользователях, повторном открытии браузеров и так далее. Я бы хотел, чтобы наши пользователи не входили в систему, кроме как раз в месяц, что бы ни происходило !

Также имеет ли значение, если я использую свой собственный контроль входа в систему (не стандартный контроль входа в систему asp.net)? Если я правильно понимаю, я думаю, что мне нужно будет создать билет аутентификации вручную.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Вы можете установить файл cookie аутентификации на компьютере пользователя и установить его срок действия в конце месяца. Тогда ваш код аутентификации может просто проверить наличие куки и автоматически войти в систему пользователя на основе содержимого куки.

1 голос
/ 12 декабря 2010

Возьмите сессию out of process и увеличьте SessionTimeout до макс.

1 голос
/ 12 декабря 2010

Я не знаю, есть ли «стандартный» способ.Это будет зависеть от вашей заявки.Основное изменение заключается в том, что вы помещаете данные сеанса в некую форму, которая сохраняется на протяжении циклов.У меня есть приложение, в котором я сохранял информацию о «поездке» и сериализовал ее в файл XML.Вот код, который я использовал в этом случае.Это может быть полезным начальным местом:

using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using Cravens.Infrastructure.Logging;

namespace TruckTrackerWeb.Code
{
    public class TripSessions
    {
        private const string _relativeSesionFile = "~/App_Data/TripSessions.txt";
        private readonly string _sessionFile;
        private readonly ILogger _logger;
        private readonly Dictionary<Guid, TripSession> _sessions;
        private readonly TimeSpan _maxAge = new TimeSpan(1, 0, 0, 0);

        public TripSessions(ILogger logger, HttpContextBase httpContextBase)
        {
            _logger = logger;


            _sessionFile = httpContextBase.Server.MapPath(_relativeSesionFile);

            _sessions = ReadSessionFile();
        }

        public TripSession CreateSession(string userName, int truckId)
        {
            try
            {
                TripSession tripSession = new TripSession
                                              {
                                                  Id = Guid.NewGuid(),
                                                  Expiration = DateTime.Now + _maxAge,
                                                  TruckId = truckId,
                                                  UserName = userName
                                              };
                _sessions[tripSession.Id] = tripSession;
                SaveSessionFile();
                _logger.Debug("Created session for: username=" + userName + ",truckid=" + truckId);
                return tripSession;
            }
            catch (Exception ex)
            {
                _logger.Error("Failed to create session. ", ex);
            }
            return null;
        }

        public TripSession GetSession(Guid id)
        {
            if(_sessions.ContainsKey(id))
            {
                return _sessions[id];
            }
            return null;
        }

        private void SaveSessionFile()
        {
            _logger.Debug("Saving trip session data to file.");
            List<string> lines = new List<string>();
            foreach (KeyValuePair<Guid, TripSession> keyValuePair in _sessions)
            {
                TripSession tripSession = keyValuePair.Value;
                lines.Add(tripSession.ToString());
            }
            File.WriteAllLines(_sessionFile, lines.ToArray());
        }

        private Dictionary<Guid, TripSession> ReadSessionFile()
        {
            _logger.Debug("******READING TRIP SESSION FILE**********");
            Dictionary<Guid, TripSession> result = new Dictionary<Guid, TripSession>();

            if(!File.Exists(_sessionFile))
            {
                _logger.Debug("The session file does not exist. file=" + _sessionFile);
                return result;
            }

            string[] lines = File.ReadAllLines(_sessionFile);
            foreach (string line in lines)
            {
                TripSession tripSession = TripSession.ParseLine(line);
                if(tripSession!=null && (DateTime.Now - tripSession.Expiration)<_maxAge)
                {
                    result[tripSession.Id] = tripSession;
                    _logger.Debug("ADDED---->" + line);
                }
                else
                {
                    _logger.Debug("EXPIRED-->" + line);
                }
            }
            return result;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...