Краткое руководство: общий доступ приложений Магазина Windows к сертификатам пользователей (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

Проверка подлинности сертификата обеспечивает высокий уровень доверия при проверке подлинности пользователя. Приложения, которым требуется надежная проверка подлинности, выходящая за рамки ввода имени пользователя и пароля, могут использовать сертификаты для проверки подлинности. В некоторых случаях группе служб может понадобиться проверить подлинность пользователя для нескольких приложений Магазина Windows. Это краткое руководство покажет вам, как реализовать проверку подлинности нескольких приложений Магазина Windows с помощью одного сертификата и как предоставить пользователю удобный код, чтобы он мог импортировать сертификат, необходимый для доступа к защищенным веб-службам.

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

Цель: Проводите проверку подлинности пользователя с помощью сертификата таким образом, чтобы его могли использовать несколько приложений Магазина Windows для нескольких защищенных веб-служб.

Необходимые условия

Это краткое руководство является только примером и будет использовать Microsoft IIS на вашем локальном компьютере. Чтобы запустить краткое руководство, вам понадобится:

  • Windows 8.1
  • Microsoft Visual Studio
  • Microsoft IIS

Инструкции

1. Включение IIS и сопоставление сертификата клиента

Служба IIS не включена по умолчанию. Вы можете включить IIS с помощью панели управления Windows.

  1. Откройте панель управления Windows и выберите Программы.
  2. Выберите Включение или отключение компонентов Windows.
  3. Разверните разделы Службы IIS и Службы Интернета. Разверните Компоненты для разработки приложений и выберите ASP.NET 3.5 и ASP.NET 4.5. При этом автоматически включатся службы IIS.
  4. Нажмите ОК, чтобы применить изменения.

2. Создание и публикация защищенной веб-службы

На этом этапе мы создадим защищенную веб-службу и опубликуем ее на сервере IIS.

  1. Запустите Visual Studio от имени администратора и выберите Создать проект на начальной странице. Для публикации веб-службы на сервере IIS требуется доступ с правами администратора. В диалоговом окне "Создание проекта" измените платформу на .NET Framework 3.5. Выберите Visual C# > Web > Visual Studio > Приложение веб-службы ASP.NET. Назовите приложение "FirstContosoBank". Чтобы создать проект, нажмите ОК.

  2. В файле Service1.asmx.cs замените веб-метод по умолчанию HelloWorld следующим методом "Login".

            [WebMethod]
            public string Login()
            {
                // Verify certificate with CA
                var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(
                    this.Context.Request.ClientCertificate.Certificate);
                bool test = cert.Verify();
                return test.ToString();
            }
    
  3. Сохраните файл Service1.asmx.cs.

  4. В обозревателе решений щелкните правой кнопкой мыши приложение "FirstContosoBank" и выберите Опубликовать.

  5. В диалоговом окне публикации веб-сайта создайте новый профиль и назовите его "ContosoProfile". Нажмите кнопку Далее.

  6. На следующей странице введите имя вашего сервера IIS и укажите имя сайта "Веб-сайт по умолчанию/FirstContosoBank". Нажмите Опубликовать, чтобы опубликовать свою веб-службу.

3. Настройка веб-службы на использование проверки подлинности сертификата клиента

На этом этапе мы используем диспетчер служб IIS для настройки опубликованной веб-службы таким образом, чтобы она запрашивала сертификат клиента.

  1. Запустите диспетчер служб IIS.
  2. Разверните сайты вашего сервера IIS. В разделе Веб-сайт по умолчанию выберите новую веб-службу "FirstContosoBank". В разделе Действия выберите Дополнительные параметры.
  3. Установите для параметра Пул приложений значение .NET v2.0 и нажмите ОК.
  4. В диспетчере служб IIS выберите свой сервер IIS и дважды щелкните Сертификаты сервера. В разделе Действия выберите Создать самозаверенный сертификат.... Введите "ContosoBank" в качестве понятного имени сертификата и нажмите ОК. При этом будет создан новый сертификат, используемый сервером IIS в форме "<имя-сервера>.<имя-домена>".
  5. В диспетчере служб IIS выберите веб-сайт по умолчанию. В разделе Действия выберите Привязка, затем нажмите Добавить.... Выберите "https" в качестве типа, задайте порт "443" и введите полное имя узла вашего сервера IIS ("<имя-сервера>.<имя-домена>"). Установите для SSL-сертификата значение "ContosoBank". Нажмите ОК. Нажмите кнопку Закрыть в окне Привязки сайта.
  6. В диспетчере служб IIS выберите веб-службу "FirstContosoBank". Дважды щелкните Параметры SSL. Установите флажок Требовать SSL. В разделе Сертификаты клиента выберите Требовать. В разделе Действия нажмите кнопку Применить.
  7. Вы можете проверить правильность настройки веб-службы, открыв браузер и введя следующий веб-адрес: "https://<имя-сервера>.<имя-домена>/FirstContosoBank/Service1.asmx". Например, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Если ваша веб-служба настроена правильно, вы получите предложение выбрать сертификат клиента, чтобы получить доступ к веб-службе.

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

4. Создание приложения Магазина Windows, использующего проверку подлинности сертификата

Теперь, когда у вас есть одна или несколько защищенных веб-служб, вы можете создать приложения Магазина Windows, которые используют сертификаты для проверки подлинности в этих веб-службах. Когда вы отправляете запрос в веб-службу с проверкой подлинности с помощью объекта HttpClient, начальный запрос не будет содержать сертификат клиента. Веб-служба с проверкой подлинности ответит запросом на проверку подлинности клиента. При этом клиент Windows автоматически запросит хранилище сертификатов на наличие доступных сертификатов клиента. Пользователь может выбрать из этих сертификатов нужный, чтобы пройти проверку подлинности в веб-службе. Некоторые сертификаты защищены паролем, поэтому следует предоставить пользователю возможность ввести пароль для сертификата.

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

Совет  Можно использовать makecert.exe, чтобы создать PFX-файл для использования с данным кратким руководством. Подробнее об использовании makecert.exe см. в разделе MakeCert.

 

  1. Откройте Visual Studio и выберите Создать проект на начальной странице. Выберите Visual C# > Магазин Windows > Пустое приложение (XAML). Назовите новый проект "FirstContosoBankApp". Чтобы создать проект, нажмите ОК.

  2. В файле default.html добавьте следующий HTML-код в элемент body по умолчанию. Этот HTML-код включает кнопку для перехода к импортируемому PFX-файлу, текстовое поле для ввода пароля в случае защищенного паролем PFX-файла, кнопку для импорта выбранного PFX-файла, кнопку входа в защищенную веб-службу и текстовый блок для отображения статуса текущего действия.

    <div>
        <button id="Browse" style="width:400px;height:80px;font-size:18px">Browse for PFX file</button><br />
        PFX password <input id="PfxPassword" type="text" style="width:200px" /> (optional)<br />
        <button id="Import" style="width:400px;height:100px;font-size:20px">Import certificate (PFX file)</button><br />
        <button id="Login" style="width:400px;height:100px;font-size:20px">Login</button>
        <div id="Result" style="width:400px;height:400px;color:white" />
    </div>
    
  3. Сохраните файл default.html.

  4. В файле default.js из папки js замените функцию по умолчанию app.onactivated следующими переменными и функцией. Они указывают адрес защищенного метода "Login" вашей веб-службы "FirstContosoBank" и глобальную переменную, содержащую сертификат PFX для импорта в хранилище сертификатов. Обновите <имя-сервера> до полного имени сервера IIS.

    var pfxPassword;
    var pfxCert;
    var requestUri = new Windows.Foundation.Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    var result;
    
    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
    
            pfxPassword = document.getElementById("PfxPassword");
            result = document.getElementById("Result");
            document.getElementById("Import").addEventListener("click", import_click, false);
            document.getElementById("Login").addEventListener("click", login_click, false);
            document.getElementById("Browse").addEventListener("click", browse_click, false);
    
            args.setPromise(WinJS.UI.processAll());
        }
    };
    
  5. В файл default.js добавьте следующий обработчик щелчка для кнопки входа и метод доступа к защищенной веб-службе.

    function login_click() {
        makeHttpsCall();
    }
    
    function makeHttpsCall() {
        var returnMessage = "Login ";
    
        var response;
    
        try {
            var httpClient = new Windows.Web.Http.HttpClient();
            httpClient.getAsync(requestUri).then(
                function (response) {
                    if (response) {
                        if (response.statusCode == Windows.Web.Http.HttpStatusCode.ok) {
                            returnMessage += "successful";
                        }
                        else {
                            returnMessage += "failed with ";
                            returnMessage += response.StatusCode;
                        }
    
                        result.innerHTML = returnMessage;
                    }
                });
    
        }
        catch (ex) {
            returnMessage += "failed with ";
            returnMessage += ex.Message;
        }
    
        result.innerHTML = returnMessage;
    }
    
  6. В файл default.js добавьте следующие обработчики щелчка для кнопки перехода к PFX-файлу и кнопки импорта выбранного PFX-файла в хранилище сертификатов.

        function import_click() {
            try {
                result.innerHTML += "Importing selected certificate into user certificate store....<br />";
                var certmgr = Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager.userCertificateEnrollmentManager;
                certmgr.importPfxDataAsync(
                    pfxCert,
                    pfxPassword.text,
                    Windows.Security.Cryptography.Certificates.ExportOption.exportable,
                    Windows.Security.Cryptography.Certificates.KeyProtectionLevel.noConsent,
                    Windows.Security.Cryptography.Certificates.InstallOptions.deleteExpired,
                    "Import Pfx").then(
                        function () {
                            result.innerHTML += "Certificate import succeded<br />";
                        });
            }
            catch (ex) {
                result.innerHTML += "Certificate import failed with " + ex.Message + "<br />";
            }
        }
    
        function browse_click() {
            var resultMessage = "Pfx file selection ";
    
            var pfxFilePicker = new Windows.Storage.Pickers.FileOpenPicker();
            pfxFilePicker.fileTypeFilter.append(".pfx");
            pfxFilePicker.commitButtonText = "Open";
    
            try
            {
                pfxFilePicker.pickSingleFileAsync().then(
                    function (pfxFile) {
                        if (pfxFile != null) {
                            Windows.Storage.FileIO.readBufferAsync(pfxFile).then(
                                function (buffer) {
                                    var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
                                    var bytes = new Uint8Array(buffer.length);
                                    dataReader.readBytes(bytes);
                                    dataReader.close();
                                    pfxCert = btoa(bytes) 
                                    pfxPassword.text = "";
                                    resultMessage += "succeeded";
                                });
                        }
                        else {
                            resultMessage += "failed";
                        }
                    });
            }
            catch (ex) {
                resultMessage += "failed with ";
                resultMessage += ex.Message;
            }
    
            result.innerHTML = resultMessage;
        }
    
  7. Сохраните файл default.js.

  8. Теперь можно нажать F5, чтобы запустить приложение Магазина Windows и войти в защищенную веб-службу, а также импортировать PFX-файл в локальное хранилище сертификатов.

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

Сводка

С помощью этого краткого руководства вы узнали, как создать веб-службу, защищенную сертификатом клиента, и приложение Магазина Windows, которое может получить доступ к этой защищенной веб-службе.

Связанные разделы

Проверка подлинности и удостоверение пользователя