Partilhar via


Preparar o Código Fonte do Servidor de Identidade Project

 

Aplica-se a: Windows Azure Pack

Preparar o projeto thinktecture Identity Server Visual Studio requer o download do código fonte do projeto a partir de GitHub, garantindo a instalação dos pacotes NuGet corretos e fazendo as atualizações necessárias ao código fonte.

O código de origem original do Servidor de Identidade de pensamento requer duas atualizações para que funcione com Windows Azure Pack. A primeira alteração adiciona um novo valor "upn" de reclamação e a segunda acrescenta um valor para satisfazer os requisitos mínimos de certificado de assinatura.

Finalmente, o site da solução tem de ser publicado para o destino pretendido.

Preparar a Solução Visual Studio

Para preparar a solução de Visual Studio do servidor de identidade de pensamento

  1. Descarregue a Visual Studio Project de pensamento de https://github.com/thinktecture/Thinktecture.IdentityServer.v2.

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

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

  4. Selecione o botão Restaurar para restaurar quaisquer pacotes NuGet em falta.

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

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

Adicionar um novo valor "upn" de reclamação

Para trabalhar corretamente com Windows Azure Pack deve ser adicionado um novo valor "upn" ao código fonte do Serviço de Identidade de pensamento.

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

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

  2. Na função GetExternalOutputClaims, encontre 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. Construa a solução e corrija quaisquer erros.

A secção de código agora deve olhar o seguinte:

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 assinatura

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

Para satisfazer os requisitos mínimos de certificado de assinatura

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

  2. Na parte superior do ficheiro adicione as seguintes declarações:

    using System.IdentityModel.Tokens;
    using System.Reflection;
    
  3. Adicione a seguinte função 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 fim do método Application_Start() com o seguinte código:

    HijackMinimumSigningCertificateRequirements();
    
  5. Construa a solução e corrija quaisquer erros.

O código completo deverá ter o seguinte aspeto:

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

        }

    }
}

Publicação do Código do Site

Uma vez que a solução tenha sido compilada com sucesso, pode publicar o código do site para o sistema de ficheiros local ou publicá-lo no servidor a partir do seu funcionamento. Os seguintes passos demonstram a publicação no sistema de ficheiros local

Para publicar no Sistema de Arquivos Locais

  1. Em Visual Studio Explorador de Soluções, clique com o botão direito no webSite do projeto e selecione Publish.

  2. Na secção Perfil, selecione <New...> na caixa de lista de drop down, introduza um novo nome de perfil e prima OK.

  3. Na secção 'Ligação', selecione o Sistema de Ficheiros a partir da caixa de lista de down down do método De publicação .

  4. Desaponte a caixa de texto de localização target para o local para onde pretende publicar o site.

  5. Na secção Definições, escolha a configuração desejada na caixa de lista de queda de configuração. Por predefinição, a configuração é Release.

  6. Reveja as suas definições na Secção de Revisão e clique em Publicar para publicar o site.

Consulte também

Windows Azure Pack Fornecedores de Identidade de Terceiros