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




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


Эта структура позволяет клиентам делать вызовы методов COM как любым принципалам защиты, при условии, что они знают открытые тексты паролей для желаемой учетной записи. Если вместо указателя на явную структуру COAUTHIDENTITY передается нулевой указатель, то каждый внешний вызов будет делаться с использованием полномочий вызывающего процесса.

Чаще всего метод IClientSecurity::SetBlanket применяется для повышения уровня аутентификации отдельного заместителя. Следующий код демонстрирует эту технологию:

HRESULT Encrypt(IApe *pApe) { IClientSecurity *pcs = 0; // ask proxy manager for IClientSecurity interface // запрашиваем интерфейс IClientSecurity у администратора заместителей HRESULT hr = pApe->QueryInterface(IID_IClientSecurity, (void**)&pcs); if (SUCCEEDED(hr)) { hr = pcs->SetBlanket(pApe, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE); pcs->Release(); } return hr; }

В идеале вызывающая программа передаст этой функции скопированный интерфейсный заместитель. В противном случае с целью проведения операции копирования эту функцию можно было бы изменить следующим образом:

HRESULT DupeAndEncrypt(IApe *pApe, IApe * &rpSecretApe) { rpSecretApe = 0; IClientSecurity *pcs = 0; // ask proxy manager for IClientSecurity interface // запрашиваем интерфейс IClientSecurity у администратора заместителей HRESULT hr = pApe->QueryInterface(IID_IClientSecurity, (void**)&pcs); if (SUCCEEDED(hr)) { hr = pcs->CopyProxy(pApe, (IUnknown**)&rpSecretApe); if (SUCCEEDED(hr)) hr = pcs->SetBlanket (rpSecretApe, RPC_AUUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, RPC_С_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, 0, EOAC_NONE); pcs->Release(); } return hr; }

Для удобства в COM API предусмотрены оберточные функции вокруг каждого из трех методов IClientSecurity, которые изнутри вызывают QueryInterface для нахождения соответствующего интерфейса IClientSecurity и затем вызывают нужный метод:

// get security settings for interface proxy pProxy // получаем установки защиты для интерфейсного заместителя pProxy HRESULT CoQueryProxyBlanket([in] IUnknown *pProxy, [out] DWORD *pAuthnSvc, [out] DWORD *pAuthzSvc, [out] OLECHAR **pServerPrincName, [out] DWORD *pAuthnLevel, [out] DWORD *pImpLevel, [out] void **pAuthInfo, [out] DWORD *Capabilities);




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