> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Autenticación mediante proveedores de identidad SAML en ABBYY FlexiCapture 12

> Autentique a los usuarios de ABBYY FlexiCapture 12 mediante un proveedor de identidad SAML: obtenga el dato SAML, envíelo mediante POST codificado en Base64 al Servidor de aplicaciones y use el ticket.

<div id="overview-of-the-authentication-process">
  ## Descripción general del proceso de autenticación
</div>

La autenticación SAML permite a los usuarios de ABBYY FlexiCapture 12 evitar enviar datos de identidad (como el nombre de usuario y la contraseña) al componente Servidor de aplicaciones de FlexiCapture, ya que pueden autenticarse en un proveedor de identidad de terceros (por ejemplo, Google o Facebook) y, a continuación, enviar al Servidor de aplicaciones los datos que confirman que la autenticación se ha realizado correctamente mediante un tercero de confianza.

El proceso de autenticación SAML en una aplicación de usuario consta de los siguientes pasos:

* Autenticarse en el proveedor de identidad de terceros
* Obtener del proveedor de identidad de terceros el dato de autenticación SAML del usuario
* Enviar el dato de autenticación SAML al Servidor de aplicaciones
* Recibir un ticket de autenticación del Servidor de aplicaciones

Este ticket puede utilizarse posteriormente en las solicitudes al Servidor de aplicaciones.

<Note>
  La cuenta de usuario debe existir en la base de datos de FlexiCapture y debe tener todos los permisos necesarios.
</Note>

<div id="implementation">
  ## Implementación
</div>

<div id="get-saml-data">
  ### Obtener dato SAML
</div>

El dato SAML del proveedor de identidad de terceros tiene el siguiente formato (este ejemplo es de OneLogin):

```xml theme={null}
<?xml version="1.0" encoding="UTF-8" ?>
   <samlp:Response xmlns:saml = "urn:oasis:names:tc:SAML:2.0:assertion"
   xmlns:samlp = "urn:oasis:names:tc:SAML:2.0:protocol" ID = "R85bc5e644b6749bf20939c99cacf35945d74bf48" Version = "2.0"
   IssueInstant = "2016-09-15T09:56:20Z" Destination = "{recipient}" InResponseTo = "_1ba6250c-3c4e-49e1-9bff-fc82bc266b34">
      <saml:Issuer>https://app.onelogin.com/saml/metadata/585198</saml:Issuer>
      <samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/></samlp:Status>
      <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
         xmlns:xs="https://www.w3.org/2001/XMLSchema"
         xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="2.0" ID="pfx5b0edaf1-7296-f635-b387-a964c92e4d5f" IssueInstant="2016-09-15T09:56:20Z">
         <saml:Issuer>https://app.onelogin.com/saml/metadata/585198</saml:Issuer>
         <ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
               <ds:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
               <ds:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
               <ds:Reference URI="#pfx5b0edaf1-7296-f635-b387-a964c92e4d5f">
                  <ds:Transforms>
                     <ds:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                     <ds:Transform Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>udRgHOqBktJRsEzF5xkmJMOuwIk=</ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>LfHQBqg+S72CtSefOA8KMNxTUpOJcFCdemZ2BlCU/FR1n6pnLqZT6+m90729ciy7CNzT/w40GCcuVDggcgDKFqDb47Wzc6vs7ejC8W9OAdbJKXBK5jwYeYcJO4utN15k4e18Bv8zv96Bx/C8mBxcflSSP5C/tDAtbzvPBsyd25qADNTsKxwppZxAh4frdmSFQ4rYCOO1PnBFrS3zzguGXB9ZM0V9AAPYEJ5nU046NIVt3FTwZFoycZW2PxG+/o/JSXWS6loPnQZkWkTwrIuAcRh1dPlOSDvllGELD4Z7BN4wEVXOFBJtaU+ILlBgncNwQvFIGLF5a6YhG0hGYLaPsA==</ds:SignatureValue>
            <ds:KeyInfo>
               <ds:X509Data>
                  <ds:X509Certificate>MIIEDjCCAvagAwIBAgIUQWL60N8pdoL8VJeC0v2eJV6OL4AwDQYJKoZIhvcNAQEFBQAwVTELMAkGA1UEBhMCVVMxDjAMBgNVBAoMBUFCQllZMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgOTE1MTcwHhcNMTYwOTA4MDkyNzA3WhcNMjEwOTA5MDkyNzA3WjBVMQswCQYDVQQGEwJVUzEOMAwGA1UECgwFQUJCWVkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA5MTUxNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3vEVaTlbLjzwJPDpGCKC4TnCbnYMsxwInvKABFF4S21PYHG6M47zkO1MylP89BUXySk8TdeHb1Sd3upSoqGaM3uGd+/kv7KW71QQQG9AtczWom8VfPxju9L9t1bSsMVYjXGROv40H1Q99dGsFraiSvKAKUj5ABY6WdVNaKAU50y7XzbnwCGm65ErLwH4hW+t0wJew/hOWSb9grtKkBWNJN3BUGBOVG9YJD5U4OYGJJaeha/dvh+LpaKG2wT2EZUo/o6789bovh4VaTRqeuVruIyafxzljpOuyHSHu0JarsFqYR45NoMqMEJIbYcA62IeenAANpqwAWIb8+LPGr7YcCAwEAAaOB1TCB0jAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBS+6YWUYqLJeYXS8djijIaLxZlL+TCBkgYDVR0jBIGKMIGHgBS+6YWUYqLJeYXS8djijIaLxZlL+aFZpFcwVTELMAkGA1UEBhMCVVMxDjAMBgNVBAoMBUFCQllZMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgOTE1MTeCFEFi+tDfKXaC/FSXgtL9niVeji+AMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAbSP3ubKUVG/Jg6jOGKQ46Rr6nSgP7Sf9zWF6a08eBHXbt3YalPR/ORp9aE+hL82S8QybNxM9fLUcEpRYzZRKysMr1rJ9slCulydCNNlopQN5j+Htfd1tbqINQNNgnnRJnwIHyitREufHQ3Zb9OWWktmyfKjHbtQe+lthCxaIfac6gcPqTIZKgLiTVdnkw/15LvBNkOnjdh6cK1cZF5MF6WdxozgQwvlVQlvh7Bm5UYZ9yQfvtUmOCq+o51cF/gm+VCKCdkeavXL9YZmh6Jk5AcVaF2od29b5rtJSlDbWUnVBFHppVJ2iaWXDHcU0Ms6+hp/LpQG18o4iO9oYw25fXA==</ds:X509Certificate>
               </ds:X509Data>
            </ds:KeyInfo>
         </ds:Signature>
         <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">maksim_p@abbyy.com</saml:NameID>
            <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
               <saml:SubjectConfirmationData NotOnOrAfter="2016-09-15T09:59:20Z" Recipient="{recipient}" InResponseTo="_1ba6250c-3c4e-49e1-9bff-fc82bc266b34"/>
            </saml:SubjectConfirmation>
         </saml:Subject>
         <saml:Conditions NotBefore="2016-09-15T09:53:20Z" NotOnOrAfter="2016-09-15T09:59:20Z">
            <saml:AudienceRestriction>
               <saml:Audience>{audience}</saml:Audience>
            </saml:AudienceRestriction>
         </saml:Conditions>
         <saml:AuthnStatement AuthnInstant="2016-09-15T09:56:19Z" SessionNotOnOrAfter="2016-09-16T09:56:20Z" SessionIndex="_e5832a70-5d47-0134-7b4f-026cc9f4032d">
            <saml:AuthnContext>
               <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
            </saml:AuthnContext>
         </saml:AuthnStatement>
      </saml:Assertion>
   </samlp:Response>
```

Para saber cómo obtener datos de autenticación de un proveedor de identidad de terceros, consulte la documentación de ese proveedor. Por ejemplo, OneLogin ofrece [kits listos para usar](https://www.onelogin.com/resources/saml-toolkits) para habilitar la autenticación SAML en varios lenguajes de programación.

<div id="send-saml-data-to-flexicapture-12-application-server">
  ### Envíe dato SAML al Servidor de aplicaciones de FlexiCapture 12
</div>

Codifique el dato SAML en Base64 y envíelo al Servidor de aplicaciones mediante una solicitud POST a `https://<Application Server>/Flexicapture12/Server/Saml`. El nombre del campo que contiene el dato SAML debe ser `SAMLResponse`.

```csharp theme={null}
public static async Task sendSamlToServer( string samlData )
{
    string serviceUrl = "https://<ApplicationServer>/Flexicapture12/Server/SAML";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create( serviceUrl );
    request.Method = "POST";

    var fields = new Dictionary<string, string>();
    fields.Add( "SAMLResponse", Convert.ToBase64String( Encoding.UTF8.GetBytes( samlData ) ) );
    HttpClient client = new HttpClient();
    FormUrlEncodedContent content = new FormUrlEncodedContent( fields );
    HttpResponseMessage response = await client.PostAsync( serviceUrl, content );
    if( response.StatusCode == HttpStatusCode.OK ) {
        processServerResponse( response.Content.ToString() );
    } else {
        processServerError( response.StatusCode, response.Content.ToString() );
    }
}
```

Si está utilizando un tenant, agregue el identificador del tenant a la URL del servidor, por ejemplo, `https://<ApplicationServer>/Flexicapture12/Server/Saml?Tenant=MyTenantName`

Para que la autenticación funcione, debe haber un usuario registrado en el Servidor de aplicaciones cuyo login coincida con el identificador del dato SAML. Se utilizará como login el valor del campo `/samlp:Response/saml:Assertion/saml:Subject/saml:NameID`.

El Servidor de aplicaciones devuelve una respuesta como esta:

```xml theme={null}
<authTicket>
<userName>maksim_p@abbyy.com</userName> 
       <ticket>82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57</ticket> 
</authTicket>
```

El valor de la etiqueta `<ticket>` es el ticket de autenticación de FlexiCapture 12. Puede usar este ticket para realizar llamadas a todas las interfaces del Servidor de aplicaciones que requieran autenticación. Las solicitudes a los servicios web de FlexiCapture deben realizarse mediante la autenticación de FlexiCapture (direcciones que comienzan por `https://<ApplicationServer>/flexicapture12/Server/FCAuth/` o `https://<ApplicationServer>/flexicapture12/Server/MobileApp/`).

<div id="use-the-authenticated-fc-12-ticket">
  ### Use el ticket autenticado de FC 12
</div>

Puede enviar el ticket al servidor mediante un archivo de cookies (el archivo debe llamarse `FlexiCaptureTmpPrn`) o un encabezado `Authorization: Bearer`. Ejemplo:

```
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

Recomendamos usar el encabezado. Las cookies se admiten por compatibilidad con soluciones más antiguas.

Si la autenticación se realiza correctamente, la respuesta del servidor contendrá un valor de ticket actualizado tanto en un archivo de cookies con el mismo inicio de sesión (`FlexiCaptureTmpPrn`) como en el encabezado `AuthTicket`. La siguiente solicitud debe realizarse con el ticket actualizado (los tickets caducan después de cierto tiempo).

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Configurar un certificado de confianza en el Servidor de aplicaciones
</div>

El Servidor de aplicaciones comprobará los datos recibidos del proveedor de identidad. Para que el Servidor de aplicaciones confíe en estos datos, deben estar firmados con un certificado personalizado emitido por una autoridad incluida en la base de datos de autoridades de confianza del Servidor de aplicaciones.

Importe el certificado en la base de datos de ABBYY FlexiCapture. A partir de ese momento, los datos se comprobarán con este certificado. Para obtener más información, consulte [Configurar Single Sign-On](/es/flexi-capture/sso-settings).

Si la comprobación falla, el Servidor de aplicaciones consultará el parámetro `AllowMixedModeCertificateValidation` en la configuración `<appSettings>` del archivo `Web.config`. Si este parámetro está establecido en `true`, la comprobación se realizará con el certificado agregado a la carpeta **Trusted Root Certification Authorities** del almacén de certificados Equipo local del equipo en el que se ejecuta el Servidor de aplicaciones.

Si no se agregan certificados a la base de datos, la comprobación se realizará con el certificado ubicado en la carpeta **Trusted Root Certification Authorities**, y el parámetro `AllowMixedModeCertificateValidation` se ignorará.

**Descargue el proyecto y los materiales complementarios:** [SAML\_Example.zip](SAML_Example.zip)
