• +45 4949 9091
  • Suporte
  • Idiomas
    • Idiomas
    • English
    • Dansk
    • Svenska
    • Norsk
    • Deutsch
    • Nederlands
    • Polski
    • Français
    • Español
    • Italiano
    • Português
  • Registar-se
  • Iniciar sessão
Logótipo FoxIDs
  • Plataforma
    • Implementação
    • Multi-tenant
    • Lógica de identidade
    • Conformidade
  • Casos de uso
    • Visão geral
    • Clientes
    • Colaboradores
    • Parceiros
    • Histórias de clientes
  • Serviços
  • Preços
  • Docs e ferramentas
    • Documentação
    • Artigos
    • Ferramenta JWT
    • Ferramenta SAML 2.0
    • Ferramenta de certificados
  • Contacte-nos
  • Registar-se
  • Iniciar sessão

ITfoxtec Identity SAML 2.0

O pacote open source ITfoxtec Identity Saml2 adiciona suporte SAML 2.0 / SAML-P para aplicações .NET que precisam de atuar como Identity Provider (IdP), Service Provider (SP) ou Relying Party (RP).

O pacote ITfoxtec Identity Saml2 é útil quando SAML 2.0 deve ser implementado diretamente na aplicação. Suporta início de sessão, fim de sessão e single logout com SAML 2.0, metadados, Redirect Binding, POST Binding, Artifact Binding, assinatura e validação de mensagens, assinaturas ECDSA em versões modernas suportadas do .NET e encriptação e desencriptação configuráveis de assertions.

O nome da empresa ITfoxtec mudou para FoxIDs, mas os componentes manterão o nome ITfoxtec como parte do nome do componente por agora.

Suporte

Faça perguntas no Stack Overflow e marque com 'itfoxtec-identity-saml2'.

Para ajuda de implementação ou aconselhamento de arquitetura, envie um e-mail para contact@foxids.com.

Pacote

Lançamentos NuGet ITfoxtec Identity SAML 2.0 NuGet ITfoxtec Identity SAML 2.0 MVC NuGet ITfoxtec Identity SAML 2.0 MVC Core

Código e licença

Código no GitHub Exemplos de teste no GitHub Licença open source

Quando o FoxIDs é relevante

Existem dois caminhos práticos. Use a biblioteca open-source quando SAML 2.0 deve ser implementado diretamente na sua aplicação .NET. Se a aplicação já suportar OpenID Connect ou WS-Federation, FoxIDs pode tratar da integração SAML 2.0 externamente enquanto a aplicação continua a usar o protocolo existente.

  • Manter as aplicações em OpenID Connect ou WS-Federation enquanto a FoxIDs trata da ligação SAML 2.0
  • Operar tradução de protocolos, certificados, metadata e configuração federation específica de parceiros fora da aplicação
  • Usar FoxIDs Cloud, self-hosted ou deployment híbrido dependendo dos requisitos operacionais
  • A FoxIDs usa ITfoxtec.Identity.Saml2 para o tratamento do protocolo SAML 2.0, pelo que a biblioteca e a opção bridge estão tecnicamente alinhadas
Documentação da ponte SAML 2.0 Fale com um especialista Comece gratuitamente

Ambientes testados

O pacote ITfoxtec Identity Saml2 é testado quanto à conformidade com Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, o NemLog-in3 dinamarquês (MitID), o Context Handler dinamarquês (em dinamarquês chamado Fælleskommunal Adgangsstyring) e muitos outros IdPs e RPs.

ASP.NET MVC e ASP.NET Core MVC são suportados pelos pacotes ITfoxtec Identity SAML 2.0 MVC e MVC Core, que ajudam a integrar o pacote ITfoxtec SAML 2.0 em aplicações MVC e ASP.NET Core MVC.

Versões .NET suportadas

.NET 10.0 .NET 9.0 .NET 8.0 .NET 7.0 .NET 6.0 .NET Standard 2.1 .NET Framework 4.6.2 .NET Framework 4.8

Bindings suportados

  • Binding Redirect
  • Binding Post
  • Binding Artifact

Os bindings podem ser usados conforme necessário para:

  • Authn Request
  • Authn Response (SAML 2.0 Response)
  • Logout Request
  • Logout Response

Algoritmos de assinatura

SHA1/SHA256/SHA384/SHA512 é suportado para assinatura de mensagens.

RSA SHA1 RSA SHA256 RSA SHA384 RSA SHA512 RSA-PSS SHA256 ECDSA SHA256 ECDSA SHA384 ECDSA SHA512
Mostrar URIs dos algoritmos
  • RSA SHA1http://www.w3.org/2000/09/xmldsig#rsa-sha1
  • RSA SHA256http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
  • RSA SHA384http://www.w3.org/2001/04/xmldsig-more#rsa-sha384
  • RSA SHA512http://www.w3.org/2001/04/xmldsig-more#rsa-sha512
  • RSA-PSS SHA256http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1
  • ECDSA SHA256http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256
  • ECDSA SHA384http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384
  • ECDSA SHA512http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512

Encriptação configurável

A encriptação de assertions pode ser configurada separadamente para encriptação de dados e encriptação de chaves. As opções suportadas incluem AES-CBC, AES-GCM, transporte de chave RSA e XML Encryption 1.1 RSA-OAEP com parâmetros MGF validados.

Data
AES-CBC AES-GCM
Key
RSA 1.5 RSA-OAEP RSA-OAEP 1.1

Pode usar a ferramenta SAML 2.0 para descodificar tokens e criar certificados auto assinados com a ferramenta de certificados.

Código

O código apresentado é apenas uma seleção do código de exemplo no GitHub.

O pacote ITfoxtec Identity Saml2 é integrado numa aplicação ASP.NET Core MVC Relying Party (RP) através da configuração no Startup e adicionando um Auth Controller com os seguintes métodos. O binding apresentado pode ser alterado conforme necessário dependendo dos requisitos.

É ainda possível definir alguns parâmetros opcionais no Saml2AuthnRequest e no Saml2LogoutRequest. No Saml2AuthnRequest, por exemplo, o ForceAuthn é suportado, o que irá forçar o utilizador a introduzir credenciais mesmo que já exista um contexto SSO no Security Token Service (STS) / Identity Provider (IdP).


Adicionar configuração ao método ConfigureServices no Startup

Configuração usando metadados do IdP.
services.BindConfig<Saml2Configuration>(Configuration, "Saml2", (serviceProvider, saml2Configuration) =>
{
    saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]);
    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

    var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
    var entityDescriptor = new EntityDescriptor();
    entityDescriptor.ReadIdPSsoDescriptorFromUrlAsync(httpClientFactory, new Uri(Configuration["Saml2:IdPMetadata"])).GetAwaiter().GetResult();
    if (entityDescriptor.IdPSsoDescriptor != null)
    {
        saml2Configuration.AllowedIssuer = entityDescriptor.EntityId;
        saml2Configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices.First().Location;
        saml2Configuration.SingleLogoutDestination = entityDescriptor.IdPSsoDescriptor.SingleLogoutServices.First().Location;
        saml2Configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
    }
    else
    {
        throw new Exception("IdPSsoDescriptor not loaded from metadata.");
    }
    return saml2Configuration;
});
services.AddSaml2();
services.AddHttpClient();

Configuração sem metadados.
services.BindConfig<Saml2Configuration>(Configuration, "Saml2", (serviceProvider, saml2Configuration) =>
{
    saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]);
    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

    saml2Configuration.SignatureValidationCertificates.Add(CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SignatureValidationCertificateFile"])));
    return saml2Configuration;
});
services.AddSaml2();   

Método Login no Auth Controller

[Route("Login")]
public IActionResult Login(string returnUrl = null)
{
    var binding = new Saml2RedirectBinding();
    binding.SetRelayStateQuery(new Dictionary<string, string> 
        { { relayStateReturnUrl, returnUrl ?? Url.Content("~/") } });

    return binding.Bind(new Saml2AuthnRequest(config)).ToActionResult();
}

Método AssertionConsumerService no Auth Controller

Após um início de sessão bem-sucedido ou falhado, o método ACS recebe a resposta.
[Route("AssertionConsumerService")]
public async Task<IActionResult> AssertionConsumerService()
{       
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    var saml2AuthnResponse = new Saml2AuthnResponse(config);

    httpRequest.Binding.ReadSamlResponse(httpRequest, saml2AuthnResponse);
    if (saml2AuthnResponse.Status != Saml2StatusCodes.Success)
    {
        throw new AuthenticationException($"SAML Response status: {saml2AuthnResponse.Status}");
    }
    httpRequest.Binding.Unbind(httpRequest, saml2AuthnResponse);
    await saml2AuthnResponse.CreateSessionAsync(HttpContext,
        claimsTransform: (claimsPrincipal) => Task.FromResult(ClaimsTransform.Transform(claimsPrincipal)));

    var relayStateQuery = httpRequest.Binding.GetRelayStateQuery();
    var returnUrl = relayStateQuery.ContainsKey(relayStateReturnUrl) ? relayStateQuery[relayStateReturnUrl] : Url.Content("~/");
    return Redirect(returnUrl);
}

Método Logout no Auth Controller

[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    if (!User.Identity.IsAuthenticated)
    {
        return Redirect(Url.Content("~/"));
    }

    var binding = new Saml2PostBinding();
    var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
    return binding.Bind(saml2LogoutRequest).ToActionResult();
}

Método LoggedOut no Auth Controller

Após um fim de sessão bem-sucedido ou falhado, o método LoggedOut recebe a resposta.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

    return Redirect(Url.Content("~/"));
}

Método SingleLogout no Auth Controller

Recebe um pedido de Single Logout e envia uma resposta.
[Route("SingleLogout")]
public async Task<IActionResult> SingleLogout()
{
    Saml2StatusCodes status;
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    var logoutRequest = new Saml2LogoutRequest(config, User);
    try
    {
        httpRequest.Binding.Unbind(httpRequest, logoutRequest);
        status = Saml2StatusCodes.Success;
        await logoutRequest.DeleteSession(HttpContext);
    }
    catch (Exception exc)
    {
        // log exception
        Debug.WriteLine("SingleLogout error: " + exc.ToString());
        status = Saml2StatusCodes.RequestDenied;
    }

    var responseBinding = new Saml2PostBinding();
    responseBinding.RelayState = httpRequest.Binding.RelayState;
    var saml2LogoutResponse = new Saml2LogoutResponse(config)
    {
        InResponseToAsString = logoutRequest.IdAsString,
        Status = status,
    };
    return responseBinding.Bind(saml2LogoutResponse).ToActionResult();
}
Logótipo FoxIDs

Desenvolvido na Dinamarca. Alojado na Europa.

Programadores

  • Documentação
  • Artigos
  • Lançamentos
  • Estado do Cloud

Produto

  • Preços
  • Serviços
  • Implementação
  • Conformidade
  • Centro de confiança

Empresa

  • Sobre
  • Fornecedor SKI
  • Contacte-nos

Jurídico

  • Termos de serviço
  • Termos de autoalojamento
  • RGPD e Acordo de Proteção de Dados
  • Política de privacidade e cookies
© 2026 FoxIDs, versão 2.15.19
GitHub LinkedIn

Preferências de cookies

A FoxIDs utiliza cookies necessários para o funcionamento do site. Selecione Aceitar todos para permitir também cookies analíticos que nos ajudam a compreender e melhorar a utilização do site, ou Rejeitar todos para utilizar apenas cookies necessários. Pode alterar a sua escolha a qualquer momento na nossa Política de Privacidade e Cookies.

Ler a Política de Privacidade e Cookies