Compartilhar via


Preparando o código-fonte do servidor de identidade Project

 

Aplica-se a: Windows Azure Pack

Preparar o projeto do thinktecture Identity Server Visual Studio requer o download do código-fonte do projeto de GitHub, garantindo que os pacotes de NuGet corretos sejam instalados e fazendo as atualizações necessárias para o código-fonte.

O código-fonte original do Thinktecture Identity Server requer duas atualizações para que ele funcione com Windows Azure Pack. A primeira alteração adiciona um novo valor de declaração "upn" e a segunda adiciona um valor para atender aos requisitos mínimos de certificado de assinatura.

Por fim, o site da solução deve ser publicado no destino desejado.

Preparando a solução Visual Studio

Para preparar a solução de Visual Studio do thinktecture Identity Server

  1. Baixe o Visual Studio Project de thinktecture de https://github.com/thinktecture/Thinktecture.IdentityServer.v2.

  2. Abra a solução thinktecture Identity Server no Visual Studio 2012

  3. Em Gerenciador de Soluções, clique com o botão direito do mouse na solução 'Thinktecture.IdentityServer' e selecione Gerenciar pacotes de NuGet para solução para abrir a caixa de diálogo Gerenciar pacotes de NuGet.

  4. Selecione o botão Restaurar para restaurar os pacotes de NuGet ausentes.

  5. selecione Atualizações e instale as atualizações necessárias.

  6. Crie a solução Thinktecture.IdentityServer.

Adicionando um novo valor de declaração "upn"

Para funcionar corretamente com Windows Azure Pack, um novo valor "upn" deve ser adicionado ao código-fonte thinktecture Identity Serveer.

Para adicionar um novo valor "upn" de declaração

  1. Na solução Thinktecture.IdentityServer, abra o arquivo TokenService.cs em \Libraryes\Thinktecture.IdentityServer.core\TokenService.

  2. Na função GetExternalOutputClaims, localize o seguinte código:

    id.AddClaim(new Claim(Constants.Claims.IdentityProvider, idp.Name));
    
  3. Coloque o seguinte código imediatamente depois:

    var emailaddress = id.Claims.Single(c => c.Type == ClaimTypes.Email);
    id.AddClaim(new Claim("upn", emailaddress.Value));
    
  4. Crie a solução e corrija os erros.

A seção de código agora deve ter a seguinte aparência:

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.");
}

Satisfazendo os requisitos mínimos de certificado de autenticação

Os requisitos de certificado de assinatura devem ser atualizados para funcionar corretamente com Windows Azure Pack.

Para atender aos requisitos mínimos de certificado de autenticação

  1. Na solução Thinktecture.IdentityServer, abra o arquivo Global.asax.cs em \WebSite\Global.asax.

  2. Na parte superior do arquivo, adicione o seguinte usando instruções:

    using System.IdentityModel.Tokens;
    using System.Reflection;
    
  3. Adicione a função a seguir no final da classe MvcApplication.

    private void HijackMinimumSigningCertificateRequirements()
            {
                var _type = typeof(SignatureProviderFactory);
                var _minimumAsymmetricKeySizeInBitsForSigning = _type.GetField("_minimumAsymmetricKeySizeInBitsForSigning", BindingFlags.NonPublic | BindingFlags.Static);
                _minimumAsymmetricKeySizeInBitsForSigning.SetValue(null, 1024u);
            }
    
  4. Adicione uma chamada para a nova função como o final do método Application_Start() com o seguinte código:

    HijackMinimumSigningCertificateRequirements();
    
  5. Crie a solução e corrija os erros.

O script concluído deverá ter esta aparência:

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);

        }

    }
}

Publicando o código do site

Depois que a solução tiver sido compilada com êxito, você poderá publicar o código do site no sistema de arquivos local ou publicá-lo no servidor do qual ela será executada. As etapas a seguir demonstram a publicação no sistema de arquivos local

Para publicar no sistema de arquivos local

  1. Em Visual Studio Gerenciador de Soluções, clique com o botão direito do mouse no WebSite do projeto e selecione Publicar.

  2. Na seção Perfil, selecione <Novo...> na caixa de listagem suspensa, insira um novo nome de perfil e pressione OK.

  3. Na seção Conexão, selecione Sistema de Arquivos na caixa de listagem suspensa do método Publicar .

  4. Defina a caixa de texto Local de Destino para o local no qual você deseja publicar o site.

  5. Na seção Configurações, escolha a configuração desejada na caixa de listagem suspensa Configuração. Por padrão, a configuração é Versão.

  6. Examine suas configurações na Seção Revisão e clique em Publicar para publicar o site.

Consulte Também

Windows provedores de identidade de terceiros do Azure Pack