Il s'agit d'un modèle destiné à configurer une application API Web entièrement implémentée à l'aide de .NET 7 .
Des journaux entièrement personnalisables et automatisés qui modifient les fichiers sur un intervalle quotidien pour la lisibilité.
Modifier les valeurs dans le fichier appSettings.json pour personnaliser.
Services versés
Validations des informations d'identification de l'utilisateur
Validation de mot de passe personnalisable
Modifier les valeurs dans le fichier appSettings.json pour personnaliser.
Validation par e-mail
Validation du nom d'utilisateur
Authentification JWT
Autorisation basée sur les rôles
Comptes administratifs et membres
Services administratifs
Compte d'utilisateur d'administration par défaut
Modifier les valeurs dans le fichier appSettings.json pour personnaliser.
Prêt à la base de données
⬆ Retour à la table des matières
⬆ Retour à la table des matières
Cloner le référentiel
Terminal ouvert dans le dossier du modèle
cd webapi-fullInstallez le modèle à utiliser pour la création de projets
Pour les fenêtres
dotnet new install .Pour macOS / Linux
dotnet new install ./Vous devrez peut-être désinstaller une version pour en installer une mise à jour.
Pour éviter cet inconvénient, ajoutez simplement l'option
--forcedans la commande ci-dessus.
Créer le projet
dotnet new webapi-fullN'oubliez pas d'exécuter cette commande dans un répertoire vide car il sera utilisé comme dossier du projet.
Nommez le répertoire comme vous le souhaitez, l'espace de noms du projet héritera de ce nom.
Ajouter les migrations et créer la base de données
dotnet ef migrations add CreateUseret
dotnet ef database updateSi vous n'avez pas installé le cadre d'entité, exécutez d'abord ce qui suit:
dotnet tool install --global dotnet-ef
Exécutez le projet et essayez en utilisant Swagger
dotnet watch run⬆ Retour à la table des matières
Il existe 2 systèmes de gestion de base de données que je vais inclure.
Bien sûr, il y en a plus, mais ce sont ceux avec qui je travaille le plus.
Pour plus de fournisseurs de données , visitez la documentation officielle de l'EF Core.
Installez le package du connecteur Framework Entity.
dotnet add package Microsoft.EntityFrameworkCore.SqlServerModifiez la chaîne de connexion dans AppSettings.json en quelque chose comme ceci:
{
"ConnectionStrings" : {
"Demo" : " Server=<SERVER_NAME>;Database=<DATABASE_NAME>;Trusted_Connection=true;MultipleActiveResultSets=true;Trust Server Certificate=true "
},
...
} Modifiez votre service ApplicationDbContext pour utiliser SQL Server .
Cela se fait dans Program.cs .
builder . Services . AddDbContext < ApplicationDbContext > ( options =>
options . UseSqlServer ( builder . Configuration . GetConnectionString ( "Demo" ) )
) ;Installez le package du connecteur Framework Entity.
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQLModifiez la chaîne de connexion dans AppSettings.json en quelque chose comme ceci:
{
"ConnectionStrings" : {
"Demo" : " Host=localhost:5432;Database=<DATABASE>;Username=<USERNAME> "
},
...
} Modifiez votre service ApplicationDbContext pour utiliser PostgreSQL .
Cela se fait dans Program.cs .
builder . Services . AddDbContext < ApplicationDbContext > ( options =>
options . UseNpgsql ( builder . Configuration . GetConnectionString ( "Demo" ) )
) ;PostgreSQL nécessite quelques étapes supplémentaires pour que cette solution s'exécute.
Modifiez la propriété Is_Deleted de Class IndexedObject car ce SGBD ne prend pas en charge le type bit .
[ Required ]
[ Column ( "Is_Deleted" ) ]
[ JsonIgnore ]
public bool IsDeleted { get ; set ; } = false ;Ajoutez les éléments suivants à l'intérieur du programme.cs juste après le code de l'étape 3.
AppContext . SetSwitch ( "Npgsql.EnableLegacyTimestampBehavior" , true ) ;
AppContext . SetSwitch ( "Npgsql.DisableDateTimeInfinityConversions" , true ) ;Ceci est essentiel pour Postgre de prendre en charge nos propriétés
DateTime.
⬆ Retour à la table des matières
Les rôles utilisateur sont définis à 2 endroits pour que l'application fonctionne:
Le Role enum
Cette énumération contient les rôles disponibles de l'application ainsi que l'indice de chaque rôle.
Cet index est important pour la fonctionnalité de l'application et fonctionne de manière simple: plus l'index est élevé, plus le rôle est privilégié.
L'énume par défaut contient les valeurs suivantes:
{
"User" : 1 ,
"Admin" : 2
}Notez que l'administrateur est un indice plus élevé car c'est le rôle supérieur.
Inside programme.cs pour traduire les valeurs d'énumération en " politiques " qui sont utilisées par l'application.
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 ) ) ) ;
} ) ;Après avoir ajouté un rôle à l'énumération, il est obligatoire qu'il l'ait également ajouté ici.
Pour authentifier tout service pour un utilisateur, ajoutez simple l'attribut [Authorize] .
Il est important que le rôle soit également déclaré pour l'autorisation de travailler.
[ Authorize ( Policy = "user" ) ]
[ HttpGet ]
public IActionResult GetLoggedUser ( )
{
User user = this . userUtils . GetLoggedUser ( this . User ) ;
Log . Information ( $ "Retrieved user ' { user . UserName } '." ) ;
return Ok ( user ) ;
}Il s'agit d'un service qui peut être utilisé par n'importe quel utilisateur.
N'oubliez pas que ce n'est toujours pas un service public et que vous devez être connecté pour l'utiliser. C'est juste qu'aucun rôle spécial n'est nécessaire.
Dans AppSettings.json , il y a les informations d'identification de l'administrateur par défaut et les informations importantes.
L'application utilise ces informations pour créer automatiquement l'utilisateur sur la création de la base de données.
Les données sont déclarées sous la forme du JSON suivant:
"DefaultAdmin" : {
"Email" : " [email protected] " ,
"UserName" : " admin_user " ,
"FirstName" : " Admin " ,
"LastName" : " User " ,
"Password" : " 123 "
}Il est recommandé de changer au moins l'e-mail et le mot de passe avant de continuer.
⬆ Retour à la table des matières
La validation du nom d'utilisateur est simple mais opiniâtre.
Noms d'utilisateur:
_- Pour retourner toute la liste des règles et marquer les non valides, le message formaté est renvoyé en tant que balise HTML <ul></ul> .
Plus précisément, voici un exemple de la validation ayant échoué:
< 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 >Pour modifier ce validateur, vous devrez modifier le code car les règles ont été codées en dur. Cela s'est produit en raison de la validation du nom d'utilisateur suivant une norme.
Dans l'exemple ci-dessus, tous les validateurs passaient à l'exception de celui appliquant une longueur maximale de 40 caractères.
La validation des e-mails est assez simple.
Toutes les adresses fournies par l'utilisateur sont valides tant qu'elles collent au format.
Je ne vois aucun intérêt à modifier ce validateur mais vous êtes libre de le faire dans votre code.
Les méthodes
ValidateEmailetValidateUserNamesont définies dans le cadre de l'interfaceIUserUtils.
La validation du mot de passe est la plus complexe et facilement personnalisable et ses règles sont donc définies dans le fichier AppSettings.json .
Sur la génération de l'application, vous trouverez cette partie dans le fichier mentionné précédemment:
"PasswordValidator" : {
"AllowedNonAlphanumeric" : " !@#$._- " ,
"MaxLength" : 16 ,
"MinLength" : 8 ,
"RequireDigit" : false ,
"RequireLowercase" : true ,
"RequireNonAlphanumeric" : true ,
"RequireUppercase" : true
},Ce que cela fait est:
Cette règle définit les caractères non alphanumériques autorisés que la chaîne de mot de passe a permis d'avoir.
Les personnages ne doivent être séparés par rien. Mettez-les tous dans la chaîne JSON.
Pour ne permettre aucun non-alphanumérique, faites de la valeur une chaîne vide.
La longueur maximale fait ce que son nom implique.
Si vous le définissez sur un nombre, la chaîne de mot de passe ne peut pas dépasser autant de caractères en longueur.
Pour arrêter d'appliquer une longueur maximale pour les mots de passe, définissez la valeur sur 0.
Fonctionne comme son homologue de longueur maximale.
Les mots de passe ne peuvent pas avoir moins de caractères que le nombre défini pour ce champ.
Pour arrêter d'appliquer une longueur minimale pour les mots de passe, définissez la valeur sur 0.
Il s'agit d'une variable Boolean .
S'il est défini sur true, l'utilisateur devra utiliser au moins 1 chiffre ( [0-9] ) pour son mot de passe.
Pour ne pas appliquer cette règle, définissez sa valeur sur
false.
Il s'agit d'une variable Boolean .
S'il est réglé sur true, l'utilisateur devra utiliser au moins 1 lettre minuscule pour son mot de passe.
Pour ne pas appliquer cette règle, définissez sa valeur sur
false.
Il s'agit d'une variable Boolean .
Si elle est définie sur true, l'utilisateur devra utiliser au moins 1 des caractères non alphanumériques autorisés pour leur mot de passe.
Pour ne pas appliquer cette règle, définissez sa valeur sur
false.
Il s'agit d'une variable Boolean .
S'il est défini sur true, l'utilisateur devra utiliser au moins 1 lettre majuscule pour son mot de passe.
Pour ne pas appliquer cette règle, définissez sa valeur sur
false.
De plus, par défaut, les mots de passe ne peuvent contenir aucun caractères d'espace blanc.
Pour retourner toute la liste des règles et marquer les non valides, le message formaté est renvoyé en tant que balise HTML <ul></ul> .
Plus précisément, voici un exemple de la validation ayant échoué:
< 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 >Dans l'exemple ci-dessus, le mot de passe était presque valide mais il:
- contenait un caractère non alphanumérique non altéré et
- était trop court.
Pour modifier la validation du mot de passe, vous devez (peut) faire 3 choses:
Modifiez les règles dans le fichier AppSettings.json .
Modifiez la classe PasswordValidator pour correspondre à ces règles.
Si vous modifiez simplement les valeurs des règles existantes, il n'y en a pas besoin.
Modifiez la logique de la validation déclarée dans le cadre de l'interface IPasswordUtils dans la classe d'implémentation fournie ou en créant la vôtre.
Si vous modifiez simplement les valeurs des règles existantes, il n'y en a pas besoin.
⬆ Retour à la table des matières
Pour désinstaller le modèle, faites simplement ce qui suit:
Terminal ouvert dans le dossier du modèle
cd webapi-fullDésinstaller le modèle en fonctionnant:
Pour les fenêtres
dotnet new uninstall .Pour macOS / Linux
dotnet new uninstall ./⬆ Retour à la table des matières
DotNet-Template-webapi-full est sous licence GNU General Public License v3.0.
⬆ Retour à la table des matières