2015-01-12 2 views
0

У меня есть приложение ASP.NET MVC, которое использует различные операции веб-API. Он использует ACS для обеспечения безопасности и поэтому пользователям приходится сначала регистрироваться в своей учетной записи Microsoft, прежде чем они смогут что-либо сделать.Кэш приложения ASP.NET для хранения пользовательских данных

Одна из этих операций веб-API получает список разрешений для текущего пользователя. Этот вызов выполняется для каждого запроса страницы, так как нам нужна эта информация для правильного отображения, отключения или скрытия элементов пользовательского интерфейса. Это прекрасно работает.

Поскольку разрешения не меняются часто, я хотел бы их кэшировать, чтобы вызов веб-API выполнялся только в первый раз.

Обычно сеанс - это способ сохранить данные, специфичные для пользователя, в памяти, но я хочу оставаться без состояния/без сеанса.

Было бы технически нормально использовать кэш приложений, в котором я храню разрешения с ключом, который включает уникальную идентификацию пользователя? Существуют ли какие-либо риски/недостатки такого рода?

[Я также хотел бы сохранить возможность открытой позже заменить его (Azure) распределенного кэширования позже, если это необходимо, но сейчас решение должно быть простым построен в одном, который свободен :)]

EDIT: кеш предназначен для работы до тех пор, пока пользователь работает, поэтому это в основном кратковременный кеш.

ответ

1

Кэш приложений, похоже, не является хорошим вариантом. Прежде всего, ваш процесс приложения может быть перезапущен, а затем все данные будут потеряны. С другой стороны, если приложение работает в течение длительного времени, и у вас есть значительное число пользователей, это вызовет значительный рост объема памяти.

Я предлагаю вам использовать зашифрованные файлы cookie. После успешного входа в систему вы установите cookie с его id/разрешением и при выходе из системы удалите его. Таким образом, вы делаете логин пользователя действительно постоянным и независимым в состоянии сеанса/сервера, а также освобождаете свой сервер от ненужного хранилища. Шифрование защищает от возможности злоупотреблять файлом cookie своей обратной инженерией и получать разрешения другого пользователя.

Смотрите пример кода ниже:

// on login successful 
string EncryptedUserId = EncriptCookie(UserId, Permissions); 
HttpCookie LoginCookie = new HttpCookie("yoursitename"); 
LoginCookie.Values.Add("userinfo", EncryptedUserId); 
LoginCookie.Expires = DateTime.Now.AddYears(10); 
HttpContext.Current.Response.AppendCookie(LoginCookie); 

public static void Logout() 
{ 
    HttpCookie LoginCookie = new HttpCookie("yoursitename"); 
    LoginCookie.Expires = DateTime.Now.AddDays(-1); 
    HttpContext.Current.Response.AppendCookie(LoginCookie); 
} 

private static string EncriptCookie(int UserId, string Permissions) 
{ 
    string CookieString = UserId.ToString() + "#" + Permissions); 

    DESCryptoServiceProvider Crypt = new DESCryptoServiceProvider(); 
    Crypt.Key = ASCIIEncoding.ASCII.GetBytes("MYSECRET"); 
    Crypt.IV = ASCIIEncoding.ASCII.GetBytes("MYSECRET"); 

    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, Crypt.CreateEncryptor(), CryptoStreamMode.Write); 
    byte[] EncBytes = ASCIIEncoding.ASCII.GetBytes(CookieString); 
    cs.Write(EncBytes, 0, EncBytes.Length); 
    cs.FlushFinalBlock(); 
    string EncryptedCookie = Convert.ToBase64String(ms.ToArray()); 

    return EncryptedCookie; 
} 
+0

Спасибо за ваш ответ! Куки не ограничены по размеру? Когда перезапускается процесс приложения? Это когда перезапуск appdomain? Это не так много, я думаю? Кроме того, размер памяти: если я использую скользящие опции, это проблема? Не кэшируется ли автоматическое удаление содержимого в случае проблем с памятью? –

+0

1. Максимальный размер файла cookie - 4093 байта. Если вам нужно хранить данные, специфичные для пользователя, вы можете рассмотреть localStorage. 2. Процесс подачи заявки может быть перезапущен из-за ряда причин. Например, если вы внесете некоторые изменения и выгрузите новую dll в der derory. 3. Кэш сервера не имеет дело с объектом Application, он был разработан для совершенно другой цели. 4. Если вы нашли мой ответ приемлемым, пожалуйста, не забудьте отметить его как принятый :) –

Смежные вопросы