Подписание .NET DLL используется в качестве элемента управления ActiveX - PullRequest
2 голосов
/ 09 марта 2011

У меня есть видимый COM-файл .NET DLL, который используется в качестве элемента управления ActiveX на веб-странице, показанной в Internet Explorer.

Сам элемент управления работает отлично (хотя и с некоторыми оговорками) при вызове через JavaScriptкод с веб-страницы.

Проблема заключается в подписывании библиотеки DLL и обеспечении ее надежного доступа.Я (насколько я могу судить) подписываю проект в Visual Studio.В свойствах проекта «Подписание» я создал файл .pfx и использую его для подписи DLL.

В Internet Explorer, независимо от того, что я делаю, я не могу заставить Internet Explorer разрешить ActiveXуправлять загрузкой, не заходя вручную в параметры безопасности и изменяя параметры «Загрузить неподписанные элементы ActiveX» и «Инициализировать и создавать сценарии элементы управления ActiveX, которые не помечены как безопасные для создания сценариев» для включения / запроса.

Ответы [ 2 ]

5 голосов
/ 02 мая 2011

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

Простой пример:

[ComImport()]
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IObjectSafety
{
    [PreserveSig()]
    int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions);

    [PreserveSig()]
    int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);
}

А сам класс:

[ProgId("Testing.Test")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ComVisible(true)]
public sealed class Test : IObjectSafety
{
    #region Saftey Interface
    private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
    private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
    private const int S_OK = 0;

    [ComVisible(true)]
    public int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    {
        pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
        return S_OK;
    }

    [ComVisible(true)]
    public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
    {
        return S_OK;
    }
    #endregion

    [ComVisible(true)]
    public string TestString
    {
        get
        {
            return 'A Test';
        }
    }
}
0 голосов
/ 09 марта 2011

Чтобы IE мог загрузить подписанный элемент управления ActiveX, он должен доверять подписи, т. Е. Сертификат должен представлять собой сертификат для подписи кода, выданный одним из доверенных корневых центров сертификации, перечисленных в Internet Explorer.(См. Инструменты | Свойства обозревателя | Содержимое | Сертификаты.)

Если вы хотите, чтобы это работало везде, вам нужно купить сертификат у одного из предустановленных доверенных корней (например, Verisign).

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

Если вы только тестируете, вы можете создать свой собственный самозаверяющий сертификат.корень со знаком и установите его в IE самостоятельно.

(Даже если подпись выполнена правильно, я не уверен, что последние версии IE автоматически установят любой элемент управления ActiveX без предварительного запроса пользователя.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...