2013-08-22 3 views
1

У меня есть простой метод post в MVC-контроллере, который проверяет, является ли ModelState допустимым, а затем вызывает другой метод, передающий экземпляр модели в качестве параметра. Эта модель содержит конфиденциальные данные, которые легко получить, посмотрев на Fiddler. Моя цель - как-то маскировать или шифровать эти данные, чтобы их нельзя было увидеть на трассе http.Шифровать данные, переданные в View Model

Я видел сообщения, предлагающие использовать переменные Session или Temp, но это не вариант в моем случае.

Это то, что код выглядит следующим образом:

[HttpPost] 
[ActionName("Search")] 
[AccessControl(Xri)] 
public ActionResult SearchPost(string string1, ViewModel model) 
{ 
     model.NoResults = false;  

     if (ModelState.IsValid) 
     { 

      if (ModelState.IsValid) return RedirectToAction("TargetAction", model);    
     } 

} 

[AccessControl(Xri)] 
public ActionResult TargetAction(string arg, ViewModel viewModel) 
{ 
. 
. 
. 
} 

Скрипач показывает следующее:

/TargetAction ID = 01010101 & дата = 08% 2F14% 2F2013% 2000% 3A00% 3A00 & To? = 08% 2F21% 2F2013% 2000% 3A00% 3A00 & param1 = SomeValue & param2 = somevalue2

есть ли способ, чтобы скрыть параметры URL-адреса, показанные здесь?

+0

Ваша озабоченность в связи с пользователем, видя эту информацию? Или кто-то перехватил запрос? – Rob

+0

Оба. Положения в моей отрасли запрещают делать такие данные видимыми для всех. – user2708543

+0

Тогда почему это часть модели просмотра? Это какой-то токен аутентификации или что-то еще? – Rob

ответ

1

Вам нужно будет запустить SSL на вашем сервере.

Без сертификата сервера от доверенного органа вы можете сделать очень мало для шифрования данных по проводу. Зачем? Потому что вам нужно будет отправлять данные шифрования/дешифрования в ясный текст перед началом отправки данных, чтобы ваш клиент (вероятно, JavaScript) мог его декодировать.

Используя сертификат и действуя на 443, вы получаете встроенные функции от сервера/браузера, которые трудно выполнить в пользовательской реализации.

Если вы просто хотите затенять данные (и вывести их за пределы уровня большинства веб-пользователей), вы всегда можете кодировать данные base64, а не шифровать их. Просто убедитесь, что вы НЕ шифруете данные и все еще можете его декодировать. Этот подход не является формой шифрования.

Если вы решили принять этот подход независимо, вот несколько ресурсов: Client-side Encoding/Decoding MSDN Reference on Encoding to Base64

Приветствия.

0

У вас есть два варианта сделать это:

  1. хранить данные на сервере и дать пользователю маркер (например, GUID), чтобы передать для извлечения данных. Поскольку использование сеанса или TempData не является вариантом, вы можете сохранить модель представления в базе данных и затем перенаправить пользователя с токеном в URL-адресе, чтобы получить его при следующем запросе.

  2. Другой вариант заключается в том, чтобы пользователь передал режим просмотра в URL-адресе, как вы сейчас делаете, но передайте его в зашифрованном виде. Например, вы можете сериализовать модель в JSON, зашифровать ее с помощью одного из встроенных алгоритмов шифрования .NET, а затем перенаправить на следующее действие, передав зашифрованную строку в качестве модели вашего представления.Тогда вы могли бы изменить целевое действие на что-то вроде:

 
    [AccessControl(Xri)] 
    public ActionResult TargetAction(string arg, string encryptedViewModel) 
    { 
     var decryptedString = Decrypt(encryptedViewModel) ; // supply the decrypt function to match your encryption 
     var viewModel = JsonConvert.DeserializeObject(decryptedString); 
    } 
+0

вариант № 2 отлично работает, но я ищу «более чистое» решение. Я не знаю, существует ли это, но не больно спрашивать. Я должен упомянуть только об одном, но я могу использовать собственный класс диспетчера сеансов. – user2708543

+0

, например, можно ли пометить те данные, которые я хочу закодировать в модели, чтобы мне не пришлось ее преследовать и убедиться, что она не отображается в виде чистого текста? – user2708543

+0

Это то, что мне нравится. Model.cs: Публичный класс someClass { [EncryptMe] public string userID {get; set;} } Возможно ли создать модель, как показано выше, где атрибут EncryptMe каким-то образом маскирует данные перед позицией формы? – user2708543