ASP.NET: безопасность на основе ролей и дизайн страницы

У меня есть страница с парой сеток и небольшой формой с 7 элементами управления. Сетки показывают вспомогательные данные. Всего имеется около 320 строк кода программной части, которые обрабатывают различные события. У меня есть требование, чтобы одна конкретная роль могла редактировать только 3 поля из 7, тогда как все остальные роли, имеющие доступ к этой странице, могут редактировать их все.

Теперь к моему вопросу. Обычно мы используем подход, ограничивающий безопасность на основе ролей уровнем страницы, поскольку при выполнении этой безопасности в .Net становится полностью настраиваемым. Но в данном случае я собираюсь сделать исключение из-за этого требования, и это новая территория, где у меня нет шаблонов. Количество дублирования кода, которое мне пришлось бы сделать, чтобы создать отдельную страницу для роли с доступом только к 3 элементам управления, делает это невозможным, даже если я поместил некоторые вещи в пользовательские элементы управления, что кажется неоправданным объемом работы. так или иначе.

Моей первой мыслью было отключить все элементы управления в событии page_load, которые недоступны для текущего пользователя, но это выглядит некрасиво. Есть ли лучший способ сделать это?


person cdonner    schedule 20.12.2009    source источник


Ответы (3)


Вы можете подклассифицировать типы элементов управления, которые хотите защитить, и определить в событии OnLoad, разрешать ли пользователю редактировать.

public class ProtectedTextBox : TextBox
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        bool hasAccess = CurrentUserHasAccess(); // TODO
        if (hasAccess)
        {
            Enabled = true;
        }
        else
        {
            Enabled = false;
        }
    }
}

Затем назначьте префикс элементу управления в вашем web.config:

<pages>
    <controls>
        <add tagPrefix="me" Namespace="YourNamespace" assembly="YourAssembly" />
    </controls>
</pages>

Наконец, просто используйте его на своей странице вместо обычного текстового поля для любого поля, которое вы хотите предотвратить от изменения неавторизованными пользователями.

<me:ProtectedTextBox runat="server" <!-- etc. -->>

Сделайте то же самое для кнопок, а также для любых других типов элементов управления, которые вам нужны.

person Brant Bobby    schedule 17.02.2010

Что, если вы создадите другую форму, которая также наследует тот же код файла? Разве это не дало бы вам другое представление и не предотвратило бы дублирование кода?

person Esteban Araya    schedule 20.12.2009
comment
На первый взгляд кажется, что да, но потом я понял, что моя страница является частью 3-страничного потока. Если у меня 2 версии для одной из этих страниц, то на предыдущей странице должен быть код, который выбирает правильную версию для роли. Это кажется мне еще менее привлекательным. - person cdonner; 20.12.2009

Можете ли вы расположить элементы управления так, чтобы те, на которые влияет безопасность, были на отдельной панели, а затем скрыть панель на основе безопасности?

person Shaun Mason    schedule 20.12.2009
comment
Также есть несколько кнопок, которые нужно скрыть, как в Gridviews, так и снаружи. Не все, что зависит от роли, может быть в одной панели. - person cdonner; 20.12.2009