Cet exemple utilise notre service de sécurité et d'API Web d'application .NET .t .t pour implémenter l'authentification et l'accès aux données basées sur les rôles. Nous avons dirigé un assistant intégré pour générer un service d'authentification prêt à l'emploi. Ce service utilise le noyau de Framework Entity pour accéder à une base de données. Une application .net Maui envoie des demandes au service API Web pour obtenir ou modifier des données.

Si vous êtes nouveau dans le service Devexpress .NET App App Security & Web API, vous souhaiterez peut-être consulter les ressources suivantes:
Créer une application API Web autonome
Une solution en 1 clic pour l'API Web CRUD avec contrôle d'accès basé sur les rôles via EF Core & ASP.NET
SQL Server, si vous exécutez cette solution sur Windows.
Exécutez Visual Studio en tant qu'administrateur et ouvrez la solution. Les privilèges de l'administrateur permettent à l'IDE de créer une base de données lorsque vous exécutez le projet de service Web.
Sélectionnez WebAPI dans le menu dérouleur de débogage . Ce choix permet à Kestrel en tant que serveur Web pour Debug s'exécute.

Si vous préférez IIS Express à Kestrel, sélectionnez IIS Express dans le menu dérouleur de débogage . Utilisez un éditeur de texte externe pour ajouter le code suivant à .vsMAUI_WebAPIconfigapplicationhost.config :
< sites >
< site name = " WebSite1 " id = " 1 " serverAutoStart = " true " >
<!-* ... -->
< bindings >
< binding protocol = " http " bindingInformation = " *:65201:* " />
< binding protocol = " https " bindingInformation = " *:44317:* " />
< binding protocol = " https " bindingInformation = " *:44317:localhost " />
< binding protocol = " http " bindingInformation = " *:65201:localhost " />
</ bindings >
</ site >
<!-* ... -->
</ sites > Cliquez avec le bouton droit sur le projet MAUI , choisissez Set as Startup Project et sélectionnez votre émulateur. Notez que les périphériques physiques attachés sur l'USB ne peuvent pas accéder à la localité de votre machine.
Cliquez avec le bouton droit sur le projet WebAPI et sélectionnez Debug > Start new instance .
Cliquez avec le bouton droit sur le projet MAUI et sélectionnez Debug > Start new instance .
Devexpress Web API Service utilise des jetons Web JSON (JWT) pour autoriser les utilisateurs. Pour obtenir un jeton, passez le nom d'utilisateur et le mot de passe au point de terminaison authentique . Dans cet exemple, la logique de génération de jetons est implémentée dans la méthode WebAPIService.RequestTokenAsync :
private async Task < HttpResponseMessage > RequestTokenAsync ( string userName , string password ) {
return await HttpClient . PostAsync ( $ " { ApiUrl } Authentication/Authenticate" ,
new StringContent ( JsonSerializer . Serialize ( new { userName , password = $ " { password } " } ) , Encoding . UTF8 ,
ApplicationJson ) ) ;
}Incluez le jeton dans httpclient.defaultRequestHeaders.authorisation. Toutes les demandes suivantes peuvent ensuite accéder aux points de terminaison privés et aux données:
HttpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , await tokenResponse . Content . ReadAsStringAsync ( ) ) ;Fichier à regarder: webapiservice.cs
Nous avons implémenté les points de terminaison personnalisés suivants dans le service WebApi :
Le point de terminaison candeletepost vous permet d'envoyer une demande d'un appareil mobile au service et de vérifier si l'utilisateur actuel peut supprimer les publications. Cela vous permet d'afficher / masquer le bouton Supprimer dans l'interface utilisateur.
Fichier à regarder: updater.cs
Le point de terminaison CurrentUser renvoie des informations sur l'utilisateur authentifié.
Fichier à regarder: updater.cs
Le point de terminaison GetAuthorimage récupère une image d'auteur par ID utilisateur.
Fichier à regarder: updater.cs
Le point de terminaison GetPostimage récupère une image par ID post.
Fichier à regarder: updater.cs
La méthode Updater.UpdateDatabaseAfterUpdateSchema génère des utilisateurs et spécifie leurs informations d'identification de connexion. Vous pouvez modifier le mot de passe d'un utilisateur directement dans la base de données. Remarque: Notre framework d'application .NET multiplateforme (UI XAF) vous permet de créer rapidement un bureau ou une interface utilisateur Web qui accède à la même base de données.
Fichier à regarder: updater.cs
PermissionPolicyRole Objets dans la classe Updater Ajouter des autorisations utilisateur. L'extrait de code suivant appelle la méthode AddObjectPermissionFromLambda pour configurer le rôle "Viewer" (permettez à l'utilisateur de lire les publications publiées):
role . AddObjectPermissionFromLambda ( SecurityOperations . Read , p => p . IsPublished , SecurityPermissionState . Allow ) ;Fichier à regarder: updater.cs
La méthode AddTypePermissionsRecursively modifie les privilèges pour le rôle "éditeur" (Alex, Antony et Dennis). La méthode ajoute des autorisations crud (créer, lire, mettre à jour, supprimer) pour le type Post :
role . AddTypePermissionsRecursively < Post > ( SecurityOperations . Read | SecurityOperations . Write | SecurityOperations . Create | SecurityOperations . DeleteObject , SecurityPermissionState . Allow ) ;Fichier à regarder: updater.cs
Utilisez Textedit.Starticon et PasswordDedit.Starticon Propriétés pour afficher les icônes dans les contrôles Textedit et PasswordDedit.
< dxe : TextEdit LabelText = " Login " StartIcon = " editorsname " .../>
< dxe : PasswordEdit LabelText = " Password " StartIcon = " editorspassword " .../>Fichier à regarder: loginpage.xaml
Pour valider la saisie de l'utilisateur dans le contrôle de mot de passe de mot de passe, utilisez EditBase.Haserror et EditBase.Errortext Propriétés héréditaires.
< dxe : PasswordEdit ... HasError = " {Binding HasError} " ErrorText = " {Binding ErrorText} " />Fichier à regarder: loginpage.xaml
public class LoginViewModel : BaseViewModel {
// ...
string errorText ;
bool hasError ;
// ...
public string ErrorText {
get => errorText ;
set => SetProperty ( ref errorText , value ) ;
}
public bool HasError {
get => hasError ;
set => SetProperty ( ref hasError , value ) ;
}
async void OnLoginClicked ( ) {
/// ...
string response = await DataStore . Authenticate ( userName , password ) ;
if ( ! string . IsNullOrEmpty ( response ) ) {
ErrorText = response ;
HasError = true ;
return ;
}
HasError = false ;
await Navigation . NavigateToAsync < SuccessViewModel > ( ) ;
}
}Fichier à regarder: LoginViewModel.cs
Spécifiez la propriété héritée de Textedit.returnType pour concentrer le contrôle de mot de passe de mot de passe une fois la valeur du contrôle Textedit édité.
Utilisez la propriété PasswordEdit.ReturnCommand pour spécifier une commande ( connexion ) qui s'exécute lorsqu'un utilisateur entre le mot de passe:
< dxe : PasswordEdit ReturnCommand = " {Binding LoginCommand} " />Fichier à regarder: loginpage.xaml
public class LoginViewModel : BaseViewModel {
// ...
public LoginViewModel ( ) {
LoginCommand = new Command ( OnLoginClicked ) ;
SignUpCommand = new Command ( OnSignUpClicked ) ;
PropertyChanged +=
( _ , __ ) => LoginCommand . ChangeCanExecute ( ) ;
}
// ...
public Command LoginCommand { get ; }
public Command SignUpCommand { get ; }
// ...
}Fichier à regarder: LoginViewModel.cs
Nous avons activé la mise en cache d'image dans ce projet. Pour y parvenir, nous devions identifier les images par leur URI. Pour créer un URI, nous utilisons une multibinding qui obtient le nom d'hôte et l'ID auteur / post. Pour plus d'informations sur la mise en cache d'image, reportez-vous à la documentation MAUI.
< dx : DXImage >
< dx : DXImage .Source>
< MultiBinding StringFormat = " {}{0}PublicEndpoint/PostImage/{1} " >
< Binding Source = " {x:Static webService:WebAPIService.ApiUrl} " />
< Binding Path = " PostId " />
</ MultiBinding >
</ dx : DXImage .Source>
</ dx : DXImage >Fichier à regarder: itemspage.xaml
L'émulateur Android et le simulateur iOS demandent un certificat pour accéder à un service via HTTPS. Dans cet exemple, nous passons à HTTP en mode débogage:
#if ! DEBUG
app . UseHttpsRedirection ( ) ;
#endif< network-security-config >
< domain-config cleartextTrafficPermitted = " true " >
< domain includeSubdomains = " true " >10.0.2.2</ domain >
</ domain-config >
</ network-security-config >< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsLocalNetworking</ key >
< true />
</ dict >Cela vous permet de contourner la vérification du certificat sans avoir besoin de créer un certificat de développement ou d'implémenter des gestionnaires httpclient.
Pour plus d'informations, veuillez vous référer à Connecter aux services Web locaux à partir d'émulateurs Android et de simulateurs iOS.
Nous vous recommandons d'utiliser HTTP uniquement lorsque vous développez / déboguez votre application. En production, utilisez HTTPS pour des raisons de sécurité.
(Vous serez redirigé vers Devexpress.com pour soumettre votre réponse)