Сущность технологии COM




Программируемая защита - часть 2


Как показано на рис. 6.1, каждый отдельный интерфейсный заместитель имеет свои собственные установки защиты. Метод IClientSecurity::SetBlanket позволяет вызывающей программе изменять эти установки для каждого интерфейсного заместителя по отдельности.

Метод IClientSecurity::QueryBlanket позволяет вызывающей программе прочитать эти установки для отдельного интерфейсного заместителя. В качестве параметров, о которых вызывающая программа не беспокоится, могут быть переданы нулевые указатели. Метод IClientSecurity::СоруРгоху позволяет вызывающей программе копировать интерфейсный заместитель. Это дает возможность делать изменения в копии интерфейса, которая не будет возвращаться при последующих запросах QueryInterface об администраторе заместителей. В идеале установки защиты следовало бы делать только в скопированных интерфейсных заместителях, чтобы изолировать измененный заместитель от нормальной реализации администратора заместителей в QueryInterface; это также позволило бы нескольким потокам независимо друг от друга изменять полные установки защиты между вызовами метода.

Рис. 6.1. Безопасность и заместители

Все параметры методов IClientSecurity::SetBlanket и IClientSecurity::QueryBlanket соответствуют параметрам CoInitializeSecurity с одним значительным исключением. Седьмой параметр (pAuthInfo) указывает на набор полномочий клиента. Точная форма этих полномочий специфична для каждого модуля безопасности. Для модуля безопасности NTLM этот параметр может указывать на структуру COAUTHIDENTITY:

typedef struct _COAUTHIDENTITY { OLECHAR *User; // user account name // имя учетной записи пользователя ULONG UserLength; // wcslen(User) // длина имени пользователя OLECHAR *Domain; // Domain/Machine name // имя домена/машины ULONG DomainLength; // wcslen(Domain) // длина имени домена OLECHAR *Password; // cleartext password // пароль открытым текстом ULONG PasswordLength; // wcslen(Password) // длина пароля ULONG Flags; // must be SEC_WINNT_AUTH_IDENTITY_UNICODE // должно быть SEC_WINNT_AUTH_IDENTITY_UNICODE } COAUTHIDENTITY;




Содержание  Назад  Вперед