Подготовка исходного кода сервера удостоверений Project
Область применения: Windows Пакет Azure
Для подготовки проекта Visual Studio сервера удостоверений thinktecture требуется скачивание исходного кода проекта из GitHub, обеспечивая установку правильных пакетов NuGet и внесение необходимых обновлений в исходный код.
Исходный исходный код сервера удостоверений удостоверений требует двух обновлений для работы с Windows пакетом Azure. Первое изменение добавляет новое значение утверждения upn, а второе — значение для удовлетворения минимальных требований к сертификату подписи.
Наконец, веб-сайт решения должен быть опубликован в нужном месте назначения.
Подготовка решения Visual Studio
Подготовка решения Visual Studio сервера удостоверений
Скачайте Visual Studio Project thinktecture.https://github.com/thinktecture/Thinktecture.IdentityServer.v2
Откройте решение thinktecture Identity Server в Visual Studio 2012 г.
В Обозреватель решений щелкните правой кнопкой мыши решение Thinktecture.IdentityServer и выберите "Управление пакетами NuGet для решения", чтобы открыть диалоговое окно "Управление пакетами NuGet".
Нажмите кнопку "Восстановить", чтобы восстановить отсутствующие пакеты NuGet.
выберите Актуальные данные и установите все необходимые обновления.
Создайте решение Thinktecture.IdentityServer.
Добавление нового значения утверждения upn
Чтобы правильно работать с Windows Azure Pack, необходимо добавить новое значение upn в исходный код службы удостоверений thinktecture.
Добавление нового значения утверждения upn
В решении Thinktecture.IdentityServer откройте файл TokenService.cs в папке \Libraries\Thinktecture.IdentityServer.core\TokenService.
В функции GetExternalOutputClaims найдите следующий код:
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));
Выполните сборку решения и исправьте все ошибки.
Теперь раздел кода должен выглядеть следующим образом:
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.
Соответствие минимальным требованиям к сертификату подписи
В решении Thinktecture.IdentityServer откройте файл Global.asax.cs в файле \WebSite\Global.asax.
В верхней части файла добавьте следующие операторы using:
using System.IdentityModel.Tokens; using System.Reflection;
Добавьте следующую функцию в конец класса MvcApplication.
private void HijackMinimumSigningCertificateRequirements() { var _type = typeof(SignatureProviderFactory); var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static); _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u); }
Добавьте вызов новой функции в конце метода Application_Start() со следующим кодом:
HijackMinimumSigningCertificateRequirements();
Выполните сборку решения и исправьте все ошибки.
Готовый код должен выглядеть следующим образом:
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);
}
}
}
Публикация кода веб-сайта
После успешной компиляции решения можно опубликовать код веб-сайта в локальной файловой системе или опубликовать его на сервере, с которого он будет выполняться. Следующие шаги демонстрируют публикацию в локальной файловой системе.
Публикация в локальной файловой системе
В Visual Studio Обозреватель решений щелкните правой кнопкой мыши проект WebSite и выберите "Опубликовать".
В разделе "Профиль" выберите <"Создать..."> в раскрывающемся списке, введите новое имя профиля и нажмите кнопку "ОК".
В разделе "Подключение" выберите "Файловая система " в раскрывающемся списке "Метод публикации ".
Задайте текстовое поле "Целевое расположение" в расположении, в которое нужно опубликовать сайт.
В разделе Параметры выберите нужную конфигурацию в раскрывающемся списке "Конфигурация". По умолчанию конфигурация является выпуском.
Просмотрите параметры в разделе "Рецензирование" и нажмите кнопку "Опубликовать ", чтобы опубликовать веб-сайт.