Можете ли вы доверять 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 толковый словарь. Это несколько кеш, который живет только для одного запроса.

Другие вопросы по тегам