> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/es/seguridad/forms-authentication.md).

# Autenticación por formularios

{% hint style="warning" %}
El script de autenticación de formularios solo se invoca cuando los usuarios inician sesión a través de la página de inicio de sesión. Si utiliza cualquier otro método de autenticación, este script no se invoca. Los scripts de políticas de roles se invocan para todos los tipos de autenticación.
{% endhint %}

De forma predeterminada, el script de autenticación de formularios está configurado para aceptar el usuario Admin y cualquier contraseña. Puede configurar esta política de autenticación para interactuar con el sistema que desee. El script recibirá un objeto `PSCredential` que contiene el nombre de usuario y la contraseña introducidos por el usuario en la página de inicio de sesión.

{% hint style="info" %}
La configuración de autenticación también se almacena con `authentication.ps1`
{% endhint %}

Para actualizar la autenticación de formularios, puede hacer clic en Configuración Seguridad y luego hacer clic en el botón Editar código de la autenticación de formularios.

Puede actualizar el script de PowerShell que se encuentra en la configuración para configurar cómo se autentica al usuario. Deberá devolver un `New-PSUAuthenticationResult` desde el script para indicar si el usuario se autenticó correctamente.

```powershell
param(
    [PSCredential]$Credential
)

#
#   You can call whatever cmdlets you like to conduct authentication here.
#   Just make sure to return the $Result with the Success property set to $true
#

if ($Credential.UserName -eq 'Admin') 
{
    New-PSUAuthenticationResult -Success -UserName 'Admin'
}
else 
{
    New-PSUAuthenticationResult -ErrorMessage 'Bad username or password'
}
```

## Establecer una contraseña

Puede comprobar la contraseña de la credencial utilizando el método `GetNetworkCredential()` de `PSCredential`.

```powershell
param(
    [PSCredential]$Credential
)

#
#   You can call whatever cmdlets you like to conduct authentication here.
#   Just make sure to return the $Result with the Success property set to $true
#

if ($Credential.UserName -eq 'Admin' -and $Credential.GetNetworkCredential().Password -eq 'MySuperSecretPassword') 
{
    New-PSUAuthenticationResult -Success -UserName 'Admin'
}
else 
{
    New-PSUAuthenticationResult -ErrorMessage 'Bad username or password'
}
```

## Establecer claims

Durante la autenticación de formularios, puede establecer claims que estarán disponibles en las políticas de roles. Esto puede aportar una mejora de rendimiento al interactuar con sistemas remotos, ya que puede realizar una única búsqueda de claims y luego evaluarlos localmente en lugar de tener que hacer llamadas adicionales al sistema remoto.

Este ejemplo utiliza Active Directory para buscar la pertenencia a grupos y asignarla como claims que estarán disponibles en los scripts de roles.

```powershell
param(
    [PSCredential]$Credential
)

#
#   You can call whatever cmdlets you like to conduct authentication here.
#   Just make sure to return the $Result with the Success property set to $true
#

$Result = [Security.AuthenticationResult]::new()
if ($Credential.UserName -eq 'Admin') 
{
    #Maintain the out of box admin user
    New-PSUAuthenticationResult -UserName 'Admin' -Success
}
else
{
    # Get current domain using logged-on user's credentials - this validates their credential
    $CurrentDomain = "LDAP://DC=mydemodomain,DC=com"  # Insert Your Domain Here
    $domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,($Credential.UserName),$Credential.GetNetworkCredential().password)

    if ($domain.name -eq $null)
    {
        "Authentication failed for $($Credential.UserName)!" | Out-File "C:\test\adlogin.txt"
        write-host "Authentication failed - please verify your username and password."
        New-PSUAuthenticationResult -UserName $Credential.UserName
    }
    else
    {
        write-host "Successfully authenticated with domain $($domain.name)"
        "Authentication success for $($Credential.UserName)!" | Out-File "C:\test\adlogin.txt"

        New-PSUAuthenticationResult -UserName $Credential.UserName -Success -Claims { 
            Get-ADPrincipalGroupMembership $Credential.UserName | Select-Object -ExpandProperty name | ForEach-Object {
                New-PSUAuthorizationClaim -Type Role -Value $_
            }
        }
    }
}
```

En su fichero `roles.ps1`, podrá utilizar estos claims para validar la pertenencia a grupos.

Este ejemplo comprueba si el usuario forma parte del grupo SOC\_Admins.

```powershell
param($User)

$Roles = $User.Claims | Where-Object Type -eq Role | Select-Object -ExpandProperty Value
$Roles -contains 'SOC_Admins'
```

## Variables

Estas son las variables definidas en los scripts de seguridad.

| Nombre           | Descripción                                                  | Tipo      |
| ---------------- | ------------------------------------------------------------ | --------- |
| $Cookies         | Cookies proporcionadas en la solicitud HTTP del cliente.     | hashtable |
| $Headers         | Encabezados proporcionados en la solicitud HTTP del cliente. | hashtable |
| $LocalIpAddress  | La dirección IP local de la solicitud.                       | string    |
| $LocalPort       | El puerto local de la solicitud.                             | string    |
| $RemoteIpAddress | La dirección IP remota de la solicitud.                      | string    |
| $RemotePort      | El puerto remoto de la solicitud.                            | string    |

## Autenticación básica

Al llamar a endpoints de API o a la API de gestión de PowerShell, puede utilizar la autenticación básica para pasar un nombre de usuario y una contraseña. Esto invocará los scripts de autenticación y autorización de formularios para validar el inicio de sesión. El nombre de usuario y la contraseña deben codificarse en Base64 con el formato `username:password` y enviarse en el encabezado Authorization con el prefijo `Basic`.

```powershell
$credentials = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("admin:admin"))
Invoke-RestMethod $Env:UniversalUrl/api/v1/accessible -Headers @{
    Authorization = "Basic $credentials"
} 
```

También puede utilizar el parámetro integrado -Credential en Invoke-RestMethod para evitar tener que codificar usted mismo las credenciales básicas. El `$AdminCredential` que aparece a continuación debe ser un `PSCredential`.

```powershell
Invoke-RestMethod $Env:UniversalUrl/api/v1/accessible -Credential $AdminCredential -Authentication Basic
```

## Inicio de sesión de Windows

Si activa el inicio de sesión nativo en el método de autenticación de formularios, PowerShell Universal intentará iniciar sesión en la máquina o el dominio actual utilizando las credenciales especificadas. Una vez iniciada la sesión, se recopilarán los grupos del usuario y se proporcionarán al sistema de autorización.

Puede configurar un dominio no predeterminado especificando el dominio de inicio de sesión nativo. Si no especifica este dominio, se utilizará el dominio predeterminado de la máquina o el dominio especificado por el usuario.

## Registro en vivo

Puede utilizar la vista de registro en vivo en la página de autenticación para ver información sobre la ejecución del script. La vista de registro en vivo mostrará los flujos de PowerShell.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/es/seguridad/forms-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
