Можете ли вы доверять ViewState для управления программой?
Я много читал о ViewState на MSDN и смотрел на эти вопросы (среди прочих):
Я вижу, что если у вас есть EnableViewStateMac
при включении ViewState подписывается вычисленным значением, называемым MAC, чтобы определить, не было ли оно подделано во время обходов, и ASP.NET сгенерирует исключение, если обнаружит, что MAC не соответствует данным ViewState клиента.
Для меня это означает, что это безопасно, если закрытый ключ, используемый для подписи ViewState, не будет каким-то образом реконструирован, подобно тому, как работает криптография SSL. Надеюсь, это правда, но поправьте меня, если это не так. Возможно, я упускаю еще один фрагмент того, как ASP.NET работает внутри, но мне кажется, что вы должны иметь возможность полагаться на состояние элемента управления для управления выполнением и потоком программы, поскольку единственный способ изменить состояние элемента управления - это код сервера. на основе обратной передачи, содержащей действительные изменения в форме клиента.
Вопрос заключается в следующем: практически нормально ли использовать состояние элемента управления (если оно не должно изменяться пользователем) для программных решений, и каковы возможные опасности и как они могут вызвать практическую проблему?
Вот два конкретных примера того, что мне интересно, безопасно обойти через вмешательство ViewState (это макет того, что я делаю):
Пример 1
Public Sub SetPageState()
If User.IsLoggedIn() Then
MultiView1.ActiveViewIndex = 0 'user is logged in
Else
MultiView1.ActiveViewIndex = 1 'user is not logged in
End If
End Sub
Private Sub PersonalizePage()
If MultiView1.ActiveViewIndex = 0 Then
'Do logged-in stuff
ElseIf MultiView1.ActiveViewIndex = 1
'Do not-logged-in stuff
End If
End Sub
Пример 2
Public Sub SetUserLoginControl()
Label1.Visible = User.IsLoggedIn()
End Sub
Private Sub DoLoginThings()
If Label1.Visible Then
'Do logged-in stuff
Else
'Do not-logged-in stuff
End If
End Sub
Я понимаю, что "правильным" способом было бы проверять User.IsLoggedIn() (или все, что нужно проверять) в любом месте, где это то, что должно управлять им, но в некоторых случаях функция является вычислительно дорогой и намного дешевле проверить состояние элемента управления, который был изменен на основе возвращаемого значения дорогой функции. Я понимаю, что есть способы обойти это, например, сохранить временную копию возвращаемого значения функции и т. Д., Но это скорее концептуальный вопрос, чем вопрос "вот моя проблема, теперь решите ее для меня".
1 ответ
Ваш код при использовании элементов управления не читается, что плохо. Вы можете кэшировать состояние User.IsLoggedIn()
в HttpContect.Current.Items
толковый словарь. Это несколько кеш, который живет только для одного запроса.