Иллюстрированный самоучитель по Architecture .NET

Разрешение принципала

Безопасность на основе ролей управляется классом PrincipalPermission. Пример под тем же названием проверяет с помощью этого класса, что личность пользователя, под которой запускается программа, – это Administrator (Администратор). Мы это делаем, передавая конструктору имя личности и строку, представляющую роль. И снова для разрешения мы применяем метод Demand (Требование), чтобы проверить законность запроса на разрешение.

// Требовать, чтобы код выполнял Администратор
PrincipalPermission *pperm = new PrincipalPermission(
wi › Name, adminRole); // Имя try
{
pperm › Demand(); Console::WriteLine(
"Code demand for an administrator succeeded.");
// "Запрос кода для Администратора успешный."
}
catch(SecurityException *)
{
Console::WriteLine(
"Demand for Administrator failed.");
// "Запрос для Администратора потерпел неудачу."
}

Если программу запустил администратор, то требование успешно удовлетворяется. В противном случае оно не удовлетворяется и запускается исключение. Затем код проверяет, является ли именем пользователя JaneAdmin (это имя не системного администратора, и оно всего лишь входит в группу Customer Admin), и что указанная роль выполняет программу.

String *customerAdminRole = // Строка "HPDESKTOP\\CustomerAdmin";
PrincipalPermission *pp;
pp = new PrincipalPermission(
"HPDESKTOP\\JaneAdmin", customerAdminRole);
try
{
pp › Demand(); Console::WriteLine(
"Demand for Customer Administrator succeeded.");
// "Запрос для Администратора клиентов успешный."
}
catch(SecurityException *)
{
Console::WriteLine(
"Demand for Customer Administrator failed.");
// "Запрос для Администратора клиентов потерпел неудачу."
}

В базовом классе CodeAccessPermission имеются методы создания разрешений, представляющих собой объединение или пересечение нескольких разрешений. Класс PrincipalPermission не является производным от CodeAccessPermission, потому что он работает на основе личности, связанной с кодом, а не с правами на код. Но как бы там ни было, он использует те же идиомы, что и классы, производные от CodeAccessPermission.

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

String *idl = "HPDESKTOP\\Administrator";
// Администратор String *id2 = "HPDESKTOP\\PeterT"; // Строка
PrincipalPermission *ppl =
new PrincipalPermission(idl, adminRole);
PrincipalPermission *pp2 =
new PrincipalPermission(id2, adminRole);
IPermission *ipermission = pp2 › Union(ppl);
// Объединение – try {
ipermission › Demand(); Console::WriteLine(
"Demand for either administrator succeeded.");
// "Запрос для любого из администраторов успешный." }
catch(SecurityException *) {
Console::WriteLine (
"Demand for either administrator failed.");
// "Запрос для любого из администраторов потерпел неудачу."
}

Затем код смотрит, запущен ли он личностью любого из администраторов.

Principal-Permission *pp3 =
new PrincipalPermission(0, adminRole);
try
{
pp3 › Demand(); Console::WriteLine(
"Demand for any administrator succeeded.");
// "Запрос для любого администратора успешный."
}
catch(SecurityException *)
{
Console::WriteLine(
"Demand for any administrator failed.");
// "Запрос для любого администратора потерпел неудачу."
}

Когда пользователи не аутентифицированы, то даже если они действительно принадлежат соответствующим ролям, выполнение Demand (Требование) все равно будет неудачным.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.