Esta es una plantilla destinada a configurar una aplicación API web completamente implementada utilizando .NET 7 .
Registros totalmente personalizables y automatizados que cambian los archivos en un intervalo diario para su legibilidad.
Editar valores en el archivo appSettings.json para personalizar.
Servicios versados
Validaciones de credenciales de usuario
Validación de contraseña personalizable
Editar valores en el archivo appSettings.json para personalizar.
Validación por correo electrónico
Validación del nombre de usuario
Autenticación JWT
Autorización basada en roles
Cuentas de administrador y miembro
Servicios de solo administrador
Cuenta de usuario de administrador predeterminada
Editar valores en el archivo appSettings.json para personalizar.
Listos para la base de datos
⬆ Volver a la tabla de contenido
⬆ Volver a la tabla de contenido
Clonar el repositorio
Abra la terminal en la carpeta de la plantilla
cd webapi-fullInstale la plantilla para usar para la creación de proyectos
Para Windows
dotnet new install .Para macOS / Linux
dotnet new install ./Es posible que necesite desinstalar una versión para instalar una actualizada.
Para evitar este inconveniente, simplemente agregue la opción
--forceen el comando anterior.
Crea el proyecto
dotnet new webapi-fullRecuerde ejecutar este comando en un directorio vacío, ya que se utilizará como carpeta del proyecto.
Nombra el directorio como quieras, el espacio de nombres del proyecto heredará ese nombre.
Agregue las migraciones y cree la base de datos
dotnet ef migrations add CreateUsery
dotnet ef database updateSi no tiene instalado Entity Framework, ejecute lo siguiente primero:
dotnet tool install --global dotnet-ef
Ejecute el proyecto y pruebe con Swagger
dotnet watch run⬆ Volver a la tabla de contenido
Hay 2 sistemas de gestión de bases de datos que incluiré.
Por supuesto, hay más, pero estos son los que más he trabajado.
Para obtener más proveedores de datos , visite la documentación oficial de EF Core.
Instale el paquete de conector de Entity Framework.
dotnet add package Microsoft.EntityFrameworkCore.SqlServerCambie la cadena de conexión en AppSettings.json a algo como esto:
{
"ConnectionStrings" : {
"Demo" : " Server=<SERVER_NAME>;Database=<DATABASE_NAME>;Trusted_Connection=true;MultipleActiveResultSets=true;Trust Server Certificate=true "
},
...
} Modifique su servicio ApplicationDbContext para usar SQL Server .
Esto se hace dentro del programa.cs .
builder . Services . AddDbContext < ApplicationDbContext > ( options =>
options . UseSqlServer ( builder . Configuration . GetConnectionString ( "Demo" ) )
) ;Instale el paquete de conector de Entity Framework.
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQLCambie la cadena de conexión en AppSettings.json a algo como esto:
{
"ConnectionStrings" : {
"Demo" : " Host=localhost:5432;Database=<DATABASE>;Username=<USERNAME> "
},
...
} Modifique su servicio ApplicationDbContext para usar PostgreSQL .
Esto se hace dentro del programa.cs .
builder . Services . AddDbContext < ApplicationDbContext > ( options =>
options . UseNpgsql ( builder . Configuration . GetConnectionString ( "Demo" ) )
) ;PostgreSQL requiere algunos pasos adicionales para que esta solución se ejecute.
Cambie la propiedad Is_Deleted de Class IndexedObject ya que este DBMS no admite el tipo bit .
[ Required ]
[ Column ( "Is_Deleted" ) ]
[ JsonIgnore ]
public bool IsDeleted { get ; set ; } = false ;Agregue el siguiente programa interno.cs justo después del código del paso 3.
AppContext . SetSwitch ( "Npgsql.EnableLegacyTimestampBehavior" , true ) ;
AppContext . SetSwitch ( "Npgsql.DisableDateTimeInfinityConversions" , true ) ;Esto es esencial para que Postgre admita nuestras propiedades
DateTime.
⬆ Volver a la tabla de contenido
Los roles de usuario se definen en 2 lugares para que la aplicación funcione:
El Role enum
Este enume posee los roles disponibles de la aplicación, así como el índice de cada rol.
Este índice es importante para la funcionalidad de la aplicación y funciona de manera simple: cuanto mayor sea el índice, más privilegiado es el papel.
El enum predeterminado contiene los siguientes valores:
{
"User" : 1 ,
"Admin" : 2
}Observe que el administrador tiene un índice más alto causa es el papel superior.
Inside Program.cs para traducir los valores de Enum en " políticas " que utilizan la aplicación.
builder . Services . AddAuthorization ( options =>
{
options . AddPolicy ( "admin" , policy => policy . Requirements . Add ( new RoleRequirement ( Role . Admin ) ) ) ;
options . AddPolicy ( "user" , policy => policy . Requirements . Add ( new RoleRequirement ( Role . User ) ) ) ;
} ) ;Después de agregar un papel a la enumación, es obligatorio que también lo haya agregado aquí.
Para autenticar cualquier servicio para un usuario, Simple agregue el atributo [Authorize] .
Es importante que el papel también se declare para que la autorización funcione.
[ Authorize ( Policy = "user" ) ]
[ HttpGet ]
public IActionResult GetLoggedUser ( )
{
User user = this . userUtils . GetLoggedUser ( this . User ) ;
Log . Information ( $ "Retrieved user ' { user . UserName } '." ) ;
return Ok ( user ) ;
}Este es un servicio que puede ser utilizado por cualquier usuario.
Recuerde que todavía no es un servicio público y debe iniciarse para usarlo. Es solo que no se necesita ningún papel especial.
Dentro de AppSettings.json , existe las credenciales de administrador predeterminadas y la información importante.
La aplicación utiliza esta información para crear automáticamente al usuario en la creación de la base de datos.
Los datos se declaran en forma del siguiente JSON:
"DefaultAdmin" : {
"Email" : " [email protected] " ,
"UserName" : " admin_user " ,
"FirstName" : " Admin " ,
"LastName" : " User " ,
"Password" : " 123 "
}Se recomienda que cambie al menos el correo electrónico y la contraseña antes de continuar.
⬆ Volver a la tabla de contenido
La validación del nombre de usuario es simple pero obstinada.
Nombres de usuario:
_- Para devolver toda la lista de reglas y marcar las inválidas, el mensaje formateado se devuelve como una etiqueta HTML <ul></ul> .
Más específicamente, aquí hay un ejemplo de la validación que ha fallado:
< ul class =' username-validation ' >
< li class =' valid ' > Username cannot contain whitespaces. </ li >
< li class =' invalid ' > Username cannot exceed 40 characters. </ li >
< li class =' valid ' > Username must be at least 6 characters long. </ li >
< li class =' valid ' > The only allowed special characters are the following: -, _ </ li >
< li class =' valid ' > Username must be lowercase. </ li >
</ ul >Para editar este validador, tendrá que editar el código ya que las reglas estaban codificadas. Esto sucedió debido a la validación del nombre de usuario después de un estándar.
En el ejemplo anterior, todos los validadores pasaron, excepto el que aplica una longitud máxima de 40 caracteres.
La validación por correo electrónico es bastante sencilla.
Todas las direcciones proporcionadas por el usuario son válidas siempre que se adhieran al formato.
No veo ningún punto en cambiar este validador, pero puede hacerlo en su código.
Tanto los métodos
ValidateEmailcomoValidateUserNamese definen como parte de la interfazIUserUtils.
La validación de contraseña es la más compleja y fácilmente personalizable, por lo que sus reglas se definen en el archivo AppSettings.json .
En la generación de la aplicación, encontrará esta parte en el archivo mencionado anteriormente:
"PasswordValidator" : {
"AllowedNonAlphanumeric" : " !@#$._- " ,
"MaxLength" : 16 ,
"MinLength" : 8 ,
"RequireDigit" : false ,
"RequireLowercase" : true ,
"RequireNonAlphanumeric" : true ,
"RequireUppercase" : true
},Lo que esto hace es:
Esta regla establece los caracteres no alfanuméricos permitidos que la contraseña se permite tener.
Los personajes no deben estar separados por nada. Simplemente póngalos todos en la cadena JSON.
Para no permitir ningún no alfanumérico, haga del valor una cadena vacía.
La longitud máxima hace lo que implica su nombre.
Si lo establece en un número, la cadena de contraseña no puede exceder tantos caracteres en longitud.
Para dejar de hacer cumplir una longitud máxima para las contraseñas, establezca el valor en 0.
Funciona como su contraparte de longitud máxima.
Las contraseñas no pueden tener menos caracteres que el número establecido para este campo.
Para dejar de hacer cumplir una longitud mínima para las contraseñas, establezca el valor en 0.
Esta es una variable Boolean .
Si se establece en True, el usuario tendrá que usar al menos 1 dígito ( [0-9] ) para su contraseña.
Para no hacer cumplir esta regla, establezca su valor en
false.
Esta es una variable Boolean .
Si se establece en True, el usuario tendrá que usar al menos 1 letra minúscula para su contraseña.
Para no hacer cumplir esta regla, establezca su valor en
false.
Esta es una variable Boolean .
Si se establece en True, el usuario tendrá que usar al menos 1 de los caracteres no alfanuméricos permitidos para su contraseña.
Para no hacer cumplir esta regla, establezca su valor en
false.
Esta es una variable Boolean .
Si se establece en True, el usuario tendrá que usar al menos 1 letra mayúscula para su contraseña.
Para no hacer cumplir esta regla, establezca su valor en
false.
Además, de forma predeterminada, las contraseñas no pueden contener ningún caracteres en blanco.
Para devolver toda la lista de reglas y marcar las inválidas, el mensaje formateado se devuelve como una etiqueta HTML <ul></ul> .
Más específicamente, aquí hay un ejemplo de la validación que ha fallado:
< ul class =' password-validation ' >
< li class =' valid ' > Password cannot contain whitespaces. </ li >
< li class =' invalid ' > The only allowed special characters are the following: !, @, #, $, ., _, - </ li >
< li class =' valid ' > Password cannot exceed 16 characters. </ li >
< li class =' invalid ' > Password must be at least 8 characters long. </ li >
< li class =' valid ' > Password must contain at least one digit. </ li >
< li class =' valid ' > Password must contain at least one lowercase letter. </ li >
</ ul >En el ejemplo anterior, la contraseña era casi válida pero:
- contenía un carácter no alfanumérico no permiso y
- era demasiado corto.
Para editar la validación de contraseña, (puede) debe hacer 3 cosas:
Edite las reglas dentro del archivo appSettings.json .
Edite la clase PasswordValidator para que coincida con esas reglas.
Si solo cambia los valores de las reglas existentes, no es necesario.
Edite la lógica de la validación declarada como parte de la interfaz IPasswordUtils dentro de la clase de implementación proporcionada o creando la suya propia.
Si solo cambia los valores de las reglas existentes, no es necesario.
⬆ Volver a la tabla de contenido
Para desinstalar la plantilla, simplemente haga lo siguiente:
Abra la terminal en la carpeta de la plantilla
cd webapi-fullDesinstale la plantilla ejecutando:
Para Windows
dotnet new uninstall .Para macOS / Linux
dotnet new uninstall ./⬆ Volver a la tabla de contenido
Dotnet-Template-Webapi-Full tiene licencia bajo GNU General Public License v3.0.
⬆ Volver a la tabla de contenido