Поделиться через


Подготовка исходного кода сервера удостоверений Project

 

Область применения: Windows Пакет Azure

Для подготовки проекта Visual Studio сервера удостоверений thinktecture требуется скачивание исходного кода проекта из GitHub, обеспечивая установку правильных пакетов NuGet и внесение необходимых обновлений в исходный код.

Исходный исходный код сервера удостоверений удостоверений требует двух обновлений для работы с Windows пакетом Azure. Первое изменение добавляет новое значение утверждения upn, а второе — значение для удовлетворения минимальных требований к сертификату подписи.

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

Подготовка решения Visual Studio

Подготовка решения Visual Studio сервера удостоверений

  1. Скачайте Visual Studio Project thinktecture.https://github.com/thinktecture/Thinktecture.IdentityServer.v2

  2. Откройте решение thinktecture Identity Server в Visual Studio 2012 г.

  3. В Обозреватель решений щелкните правой кнопкой мыши решение Thinktecture.IdentityServer и выберите "Управление пакетами NuGet для решения", чтобы открыть диалоговое окно "Управление пакетами NuGet".

  4. Нажмите кнопку "Восстановить", чтобы восстановить отсутствующие пакеты NuGet.

  5. выберите Актуальные данные и установите все необходимые обновления.

  6. Создайте решение Thinktecture.IdentityServer.

Добавление нового значения утверждения upn

Чтобы правильно работать с Windows Azure Pack, необходимо добавить новое значение upn в исходный код службы удостоверений thinktecture.

Добавление нового значения утверждения upn

  1. В решении Thinktecture.IdentityServer откройте файл TokenService.cs в папке \Libraries\Thinktecture.IdentityServer.core\TokenService.

  2. В функции GetExternalOutputClaims найдите следующий код:

    id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));
    
  3. Сразу после этого поместите следующий код:

    var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email);
    id.AddClaim(new Claim("upn", emailaddress.Value));
    
  4. Выполните сборку решения и исправьте все ошибки.

Теперь раздел кода должен выглядеть следующим образом:

protected virtual ClaimsIdentity GetExternalOutputClaims(ClaimsPrincipal principal, RequestDetails requestDetails)
{
    var idpClaim = principal.FindFirst(c => c.Type == Constants.Claims.IdentityProvider && c.Issuer == Constants.InternalIssuer);

    if (idpClaim == null)
    {
        throw new InvalidOperationException("No identity provider claim found.");
    }

    IdentityProvider idp = null;
    if (IdentityProviderRepository.TryGet(idpClaim.Value, out idp))
    {
        var transformedClaims = ClaimsTransformationRulesRepository.ProcessClaims(SanitizeInternalClaims(principal), idp, requestDetails);
        var id = new ClaimsIdentity(transformedClaims, "External");

        id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));

        var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email);
        id.AddClaim(new Claim("upn", emailaddress.Value));
        return id;
    }

    throw new InvalidRequestException("Invalid identity provider.");
}

Соответствие минимальным требованиям к сертификату подписи

Требования к сертификату подписи должны быть обновлены для правильной работы с Windows Пакете Azure.

Соответствие минимальным требованиям к сертификату подписи

  1. В решении Thinktecture.IdentityServer откройте файл Global.asax.cs в файле \WebSite\Global.asax.

  2. В верхней части файла добавьте следующие операторы using:

    using System.IdentityModel.Tokens;
    using System.Reflection;
    
  3. Добавьте следующую функцию в конец класса MvcApplication.

    private void HijackMinimumSigningCertificateRequirements()
            {
                var _type = typeof(SignatureProviderFactory);
                var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static);
                _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u);
            }
    
  4. Добавьте вызов новой функции в конце метода Application_Start() со следующим кодом:

    HijackMinimumSigningCertificateRequirements();
    
  5. Выполните сборку решения и исправьте все ошибки.

Готовый код должен выглядеть следующим образом:

using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Data.Entity;
using System.Security.Claims;
using System.Web.Helpers;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Thinktecture.IdentityServer.Repositories;
using Thinktecture.IdentityServer.Repositories.Sql;
using System.IdentityModel.Tokens;
using System.Reflection;

namespace Thinktecture.IdentityServer.Web
{
    public class MvcApplication : System.Web.HttpApplication
    {
        [Import]
        public IConfigurationRepository ConfigurationRepository { get; set; }

        [Import]
        public IUserRepository UserRepository { get; set; }

        [Import]
        public IRelyingPartyRepository RelyingPartyRepository { get; set; }


        protected void Application_Start()
        {
            // create empty config database if it not exists
            Database.SetInitializer(new ConfigurationDatabaseInitializer());

            // set the anti CSRF for name (that's a unqiue claim in our system)
            AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

            // setup MEF
            SetupCompositionContainer();
            Container.Current.SatisfyImportsOnce(this);

            AreaRegistration.RegisterAllAreas();

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, ConfigurationRepository);
            RouteConfig.RegisterRoutes(RouteTable.Routes, ConfigurationRepository, UserRepository);
            ProtocolConfig.RegisterProtocols(GlobalConfiguration.Configuration, RouteTable.Routes, ConfigurationRepository, UserRepository, RelyingPartyRepository);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            HijackMinimumSigningCertificateRequirements();
        }

        private void SetupCompositionContainer()
        {
            Container.Current = new CompositionContainer(new RepositoryExportProvider());
        }



        private void HijackMinimumSigningCertificateRequirements()
        {

            var _type = typeof(SignatureProviderFactory);

            var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static);

            _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u);

        }

    }
}

Публикация кода веб-сайта

После успешной компиляции решения можно опубликовать код веб-сайта в локальной файловой системе или опубликовать его на сервере, с которого он будет выполняться. Следующие шаги демонстрируют публикацию в локальной файловой системе.

Публикация в локальной файловой системе

  1. В Visual Studio Обозреватель решений щелкните правой кнопкой мыши проект WebSite и выберите "Опубликовать".

  2. В разделе "Профиль" выберите <"Создать..."> в раскрывающемся списке, введите новое имя профиля и нажмите кнопку "ОК".

  3. В разделе "Подключение" выберите "Файловая система " в раскрывающемся списке "Метод публикации ".

  4. Задайте текстовое поле "Целевое расположение" в расположении, в которое нужно опубликовать сайт.

  5. В разделе Параметры выберите нужную конфигурацию в раскрывающемся списке "Конфигурация". По умолчанию конфигурация является выпуском.

  6. Просмотрите параметры в разделе "Рецензирование" и нажмите кнопку "Опубликовать ", чтобы опубликовать веб-сайт.

См. также:

Windows сторонние поставщики удостоверений пакета Azure