Хранение статических пользовательских данных в приложении Windows на C#

У меня есть приложение, которому нужно попасть в ActiveDirectory, чтобы получить разрешения / роли пользователя при запуске приложения и сохранить его на всем протяжении.

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

Что-то типа:

if (UserProperties.Role == Roles.Admin)
{
    btnDelete.Visible = false;
}

Каковы лучшие практики хранения статических пользовательских данных в приложении Windows? Такие решения, как Singleton или глобальные переменные, могут работать, но я пытался избежать этого.

Является ли объект User, который передается конструктору каждой формы, столь же плохим?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 412
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать поставщик профиля из asp.net в своем приложении Windows. Проверьте это @ http://fredrik.nsquared2.com/viewpost.aspx?PostID=244&showfeedback=true

Надеюсь, это поможет, Бруно Фигейредо http://www.brunofigueiredo.com

Возможно, мое мнение омрачено частым использованием javascript, но я думаю, что если у вас есть что-то, что является имел в виду, чтобы быть глобальным, тогда использование глобальных переменных нормально.

Глобальность - это плохо, когда вы выставляете на всеобщее обозрение то, чего не должно быть. Global - это нормально, если он семантически верен для предполагаемого использования данных.

Ответ принят как подходящий

Установите Thread.CurrentPrincipal с помощью WindowsPrincipal, GenericPrincipal или вашего настраиваемого принципала. Затем вы можете просто вызвать IsInRole:

if (Thread.CurrentPrincipal.IsInRole(Roles.Admin)) {
   btnDelete.Visible = false;
}

Статические данные (или одноэлемент) подходят для этого, если вы хотите привязать данные к экземпляру приложения (или AppDomain).

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

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