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




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


Как было в случае с IClientSecurity, каждый метод IServerSecurity доступен в качестве удобной API-функции. Приводимая ниже реализация метода использует удобную подпрограмму вместо явного вызова интерфейса IServerSecurity

STDMETHODIMP Gorilla::SwingFromTree(/*[in]*/ long nTreeID) { DWORD dwAuthnLevel; // get authentication level of current call // получаем уровень аутентификации текущего вызова HRESULT hr = CoQueryClientBlanket(0, 0, 0, &dwAuthnLevel, 0, 0, 0); // verify proper authentication level // проверяем правильность уровня аутентификации if (FAILED(hr) dwAuthnLevel != RPC_C_AUTHN_LEVEL_РКТ_PRIVACY) hr = АРЕ_Е_NOPUBLICTREE; else hr = this->ActuallySwingFromTree(nTreeID); return hr; }

И снова мы видим, что последняя версия требует меньше кода и поэтому вероятность ошибок в ней меньше.

Метод IServerSecurity::QueryBlanket также позволяет разработчику объекта находить идентификатор защиты вызывающей программы через параметр pPrivs. Как и в случае с полномочиями, передаваемыми в IClientSecurity::SetBlanket, точный формат этого идентификатора является специфическим для конкретного модуля защиты. Для NTLM этот формат является просто строкой вида

Authority\AccountName

Следующая реализация метода отыскивает идентификатор защиты вызывающей программы с помощью API-функции CoQueryClientBlanket:

STDMETHODIMP Gorilla::EatBanana() { OLECHAR *pwszClientPrincipal = 0; // get security identifier of caller // получаем идентификатор защиты вызывающей программы HRESULT hr = CoQueryClientBlanket(0, 0, 0, 0, 0, (void**)&pwszClientPrincipal, 0); // log user name // регистрируем имя пользователя if (SUCCEEDED(hr)) { this->LogCallerIDToFile(pwszClientPrincipal); hr = this->ActuallyEatBanana(); } return hr; }

При вызове CoQueryClientBlanket для успешного возвращения идентификатора защиты вызывающей программы последняя должна определить:

По крайней мере RPC_C_IMP_LEVEL_IDENTIFY как автоматический (или явный) уровень заимствования прав;

По крайней мере RPC_C_AUTHN_LEVEL_CONNECT как автоматический (или явный) уровень аутентификации.




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