studio
latest
false
- Primeros pasos
- Instalación y configuración
- Proyectos de automatización
- Acerca de la publicación de proyectos de automatización
- Diseñar automatizaciones
- Gestionar paquetes de actividades
- Configuración de los Ajustes del Proyecto de Actividades
- Firma de paquetes
- Control
- Importar entidades
- Experiencia de diseño moderna
- Vincular un proyecto a una idea en Automation Hub
- Usar Data Manager
- Dependencias
- Tipos de flujos de trabajo
- Flujo de control
- Comparación de archivos
- Mejores prácticas de automatización
- Integración del control de código fuente
- Depuración
- Registro
- La herramienta de diagnóstico
- Analizador de flujo de trabajo
- Acerca del analizador de flujo de trabajo
- ST-NMG-001: convención sobre nombres de variables
- ST-NMG-002: convención de nombres de argumentos
- ST-NMG-004: duplicación de nombres de visualización
- ST-NMG-005: anulación de variables
- ST-NMG-006: argumentos de anulación de variables
- ST-NMG-008: longitud variable excedida
- ST-NMG-009: variables de datos prefijados
- ST-NMG-011: argumentos de prefijo Datatable
- ST-NMG-012: valores predeterminados de los argumentos
- ST-NMG-016: longitud del argumento excedida
- ST-NMG-017: el nombre de la clase coincide con el espacio de nombres predeterminado
- ST-DBP-002: recuento de Argumentos elevado
- ST-DBP-003: bloque de Catch vacío
- ST-DBP-007: múltiples capas de diagramas de flujo
- ST-DPB-010: varias instancias de [flujo de trabajo] o [caso de prueba]
- ST-DBP-020: propiedades de salida no definidas
- ST-DBP-021: tiempo de espera codificado
- ST-DBP-023: flujo de trabajo vacío
- ST-DBP-024: comprobación de actividad de persistencia
- ST-DBP-025: requisito previo para la serialización de variables
- ST-DBP-026: retraso en el uso de la actividad
- ST-DBP-027: mejor práctica de persistencia
- ST-DBP-028: requisito de serialización de argumentos
- ST-USG-005: argumentos de actividad codificados
- ST-USG-009: variables no utilizadas
- ST-USG-010: dependencias sin utilizar
- ST-USG-014: restricciones de los paquetes
- ST-USG-017 - Invalid parameter modifier
- ST-USG-020: mensajes de registro mínimos
- ST-USG-024: guardado sin usar para más adelante
- ST-USG-025: uso incorrecto de los valores guardados
- ST-USG-026: restricciones de actividad
- ST-USG-027: paquetes necesarios
- ST-USG-028: Restringir la invocación de plantillas de archivo
- ST-USG-032 - Etiquetas obligatorias
- ST-USG-034 - URL Automation Hub
- Variables
- Argumentos
- Espacios de nombres importados
- Automatizaciones codificadas
- Introducción
- Registrar servicios personalizados
- Contextos Antes y Después
- Generando código
- Generar casos de prueba codificados a partir de casos de prueba manuales
- Automatización atendida basada en desencadenadores
- Grabación
- Elementos de la IU
- Selectores
- Repo. de objetos
- Extracción de datos
- Automatización de imágenes y texto
- Acerca de la automatización de imágenes y texto
- Actividades con el ratón y el teclado
- Ejemplo de uso de la automatización de ratón y teclado
- Actividades de texto
- Ejemplo de uso de la automatización de texto
- Actividades de OCR
- Actividades de imagen
- Ejemplo de uso de la automatización de OCR y la automatización de imágenes
- Automatización de Citrix Technologies
- Automatización RDP
- Automatización de VMware Horizon
- Automatización de Salesforce
- Automatización SAP
- Automatización de IU de macOS
- La herramienta ScreenScrapeJavaSupport
- El protocolo WebDriver
- Extensiones
- Acerca de las extensiones
- Herramienta SetupExtensions
- UiPathRemoteRuntime.exe no se está ejecutando en la sesión remota
- UiPath Remote Runtime impide que la sesión de Citrix pueda cerrarse
- UiPath Remote Runtime provoca una fuga de memoria
- El paquete UiPath.UIAutomation.Activities y las versiones de UiPath Remote Runtime no coinciden
- La extensión de UiPath necesaria no está instalada en la máquina remota
- Configuración de la resolución de la pantalla
- Políticas de grupo
- No se puede comunicar con el navegador
- La extensión de Chrome se elimina automáticamente
- Es posible que la extensión se haya dañado
- Comprueba si la extensión para Chrome está instalada y habilitada
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Habilitar el acceso a las URL de archivos y el modo de incógnito
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- Lista de extensiones para Chrome
- Extensión de Chrome en Mac
- Políticas de grupo
- No se puede comunicar con el navegador
- La extensión de Edge se elimina automáticamente
- Es posible que la extensión se haya dañado
- Check if the Extension for Microsoft Edge is installed and enabled
- Check if ChromeNativeMessaging.exe is running
- Check if ComSpec variable is defined correctly
- Enable access to file URLs and InPrivate mode
- Multiple browser profiles
- Group Policy conflict
- Known issues specific to MV3 extensions
- Lista de extensiones para Edge
- Extensión para Safari
- Extensión para VMware Horizon
- Extensión para Amazon WorkSpaces
- Complemento SAP Solution Manager
- Add-in de Excel
- Conjunto de pruebas - Estudio
- Solución de problemas
- Acerca de la resolución de problemas
- Compatibilidad y limitaciones de Microsoft App-V
- Solución de problemas de Internet Explorer x64
- Problemas de Microsoft Office
- Identificación de elementos de la interfaz de usuario en PDF con opciones de accesibilidad
- Reparar Soporte Active Accessibility
- Validation of large Windows-legacy projects takes longer than expected
Using two-factor authentication within coded
automations
Guía de usuario de Studio
Última actualización 17 de dic. de 2024
Using two-factor authentication within coded automations
This tutorial shows how to include sample code that generates two-factor authentication codes for your automations. Here are the ways to implement the two-factor authentication code:
- Copy and paste the code into a CS file of your target project.
- Use a sample NUPGK file in your project.
When opting to use the sample NUPKG file, you have the capability to add the two-factor authentication as an activity within your XAML files.
Tip: Regardless of whether you choose to integrate the sample two-factor authentication code generator in your CS files (for coded automations) or XAML files (for low-code automations), remember that you can invoke a coded automation into a low-code one and vice versa. For more information about hybrid automations, visit Creating hybrid automations - Combining Coded and Low-code Workflows.
To use the two-factor authentication sample in your coded automation, you can copy and paste the following sample code in a CS file from your target project.
Note: The sample code generates a new authentication code every 30 seconds. For example, if an authentication code is generated at 3 hours, 45 minutes, and 27 seconds, that code is available for three seconds. A new code is then generated at the 30 seconds mark.
using System;
using System.Collections.Generic;
using UiPath.CodedWorkflows;
using System.Security.Cryptography;
namespace GenerateTwoFactorAuthenticationCode
{
public class Workflow : CodedWorkflow
{
[Workflow]
public string Execute(string secretKey)
{
return AuthenticationCode(secretKey);
}
private string AuthenticationCode(string secret)
{
// Step 1: Decode the base32 secret key
byte[] key = Base32Decode(secret);
// Step 2: Calculate the time step (current time divided by 30 seconds)
long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
long timeStep = unixTime / 30;
// Step 3: Convert time step to byte array (8 bytes, big-endian)
byte[] timeBytes = BitConverter.GetBytes(timeStep);
if (BitConverter.IsLittleEndian)
Array.Reverse(timeBytes);
// Step 4: Generate HMAC-SHA1 hash using the time step as message and secret key
using (HMACSHA1 hmac = new HMACSHA1(key))
{
byte[] hash = hmac.ComputeHash(timeBytes);
// Step 5: Extract dynamic binary code (4 bytes) from the hash
int offset = hash[hash.Length - 1] & 0x0F;
int binaryCode = (hash[offset] & 0x7F) << 24
| (hash[offset + 1] & 0xFF) << 16
| (hash[offset + 2] & 0xFF) << 8
| (hash[offset + 3] & 0xFF);
// Step 6: Modulo to get a 6-digit code
int otp = binaryCode % 1_000_000;
// Return the OTP as a zero-padded 6-digit string
return otp.ToString("D6");
}
}
// Base32 decoding function to get the byte array from the base32-encoded key
private static byte[] Base32Decode(string base32)
{
// Decode Base32-encoded string to byte array
const string base32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
int bitBuffer = 0;
int bitBufferLen = 0;
var result = new List<byte>();
foreach (char c in base32.ToUpper())
{
if (c == '=') break;
int index = base32Chars.IndexOf(c);
if (index < 0) throw new ArgumentException("Invalid Base32 character");
bitBuffer = (bitBuffer << 5) | index;
bitBufferLen += 5;
if (bitBufferLen >= 8)
{
result.Add((byte)(bitBuffer >> (bitBufferLen - 8)));
bitBufferLen -= 8;
}
}
return result.ToArray();
}
}
}
using System;
using System.Collections.Generic;
using UiPath.CodedWorkflows;
using System.Security.Cryptography;
namespace GenerateTwoFactorAuthenticationCode
{
public class Workflow : CodedWorkflow
{
[Workflow]
public string Execute(string secretKey)
{
return AuthenticationCode(secretKey);
}
private string AuthenticationCode(string secret)
{
// Step 1: Decode the base32 secret key
byte[] key = Base32Decode(secret);
// Step 2: Calculate the time step (current time divided by 30 seconds)
long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
long timeStep = unixTime / 30;
// Step 3: Convert time step to byte array (8 bytes, big-endian)
byte[] timeBytes = BitConverter.GetBytes(timeStep);
if (BitConverter.IsLittleEndian)
Array.Reverse(timeBytes);
// Step 4: Generate HMAC-SHA1 hash using the time step as message and secret key
using (HMACSHA1 hmac = new HMACSHA1(key))
{
byte[] hash = hmac.ComputeHash(timeBytes);
// Step 5: Extract dynamic binary code (4 bytes) from the hash
int offset = hash[hash.Length - 1] & 0x0F;
int binaryCode = (hash[offset] & 0x7F) << 24
| (hash[offset + 1] & 0xFF) << 16
| (hash[offset + 2] & 0xFF) << 8
| (hash[offset + 3] & 0xFF);
// Step 6: Modulo to get a 6-digit code
int otp = binaryCode % 1_000_000;
// Return the OTP as a zero-padded 6-digit string
return otp.ToString("D6");
}
}
// Base32 decoding function to get the byte array from the base32-encoded key
private static byte[] Base32Decode(string base32)
{
// Decode Base32-encoded string to byte array
const string base32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
int bitBuffer = 0;
int bitBufferLen = 0;
var result = new List<byte>();
foreach (char c in base32.ToUpper())
{
if (c == '=') break;
int index = base32Chars.IndexOf(c);
if (index < 0) throw new ArgumentException("Invalid Base32 character");
bitBuffer = (bitBuffer << 5) | index;
bitBufferLen += 5;
if (bitBufferLen >= 8)
{
result.Add((byte)(bitBuffer >> (bitBufferLen - 8)));
bitBufferLen -= 8;
}
}
return result.ToArray();
}
}
}
If you want to use a sample NUPKG file for including the two-factor code in your automations, follow these steps:
- Download the following NUPKG file: GenerateTwoFactorAuthenticationCode.nupkg.
- Upload the downloaded NUPKG file to your Orchestrator Host or Tenant feed, which are accessible through your Studio instance.
For more information on uploading the NUPKG file as a custom library to Orchestrator, visit Manually uploading a library to Orchestrator.
- Open your Studio project and open the Manage Packages menu.
- Search for the
GenerateTwoFactorAuthenticationCode
NUPKG file you previously saved to your Orchestrator Host or Orchestrator Tenant feed, and install it.Figure 1. The custom library in the Manage Packages menu
After you install the file, navigate to the Activities panel and locate GenerateTwoFactorAuthenticationCode. Drag and drop the Get 2FA token activity into your XAML files to generate an authentication code for your automations.
Figure 2. The GenerateTwoFactorAuthentication code sample in the Activities panel