Este ejemplo utiliza nuestro servicio gratuito de API de seguridad y seguridad de la aplicación .NET para implementar la autenticación y el acceso a los datos basados en roles. Ejecutamos un asistente incorporado para generar un servicio de autenticación listo para usar. Este servicio utiliza Entity Framework Core para acceder a una base de datos. Una aplicación .NET Maui envía solicitudes al servicio de API web para obtener o modificar datos.

Si es nuevo en el servicio DevexPress .NET App Security & Web API, es posible que desee revisar los siguientes recursos:
Crear una aplicación de API web independiente
Una solución de 1 clic para la API web CRUD con control de acceso basado en roles a través de EF Core & ASP.NET
SQL Server, si ejecuta esta solución en Windows.
Ejecute Visual Studio como administrador y abra la solución. Los privilegios de administrador permiten que el IDE cree una base de datos cuando ejecute el proyecto de servicio web.
Seleccione WebAPI en el menú desplegable de depuración . Esta elección permite a Kestrel a medida que se ejecuta el servidor web para la depuración.

Si prefiere IIS Express a Kestrel, seleccione IIS Express en el menú desplegable de depuración . Use un editor de texto externo para agregar el siguiente código a .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 > Haga clic derecho en el proyecto MAUI , elija Set as Startup Project y seleccione su emulador. Tenga en cuenta que los dispositivos físicos que están conectados a través de USB no pueden acceder al localhost de su máquina.
Haga clic derecho en el proyecto WebAPI y seleccione Debug > Start new instance .
Haga clic derecho en el proyecto MAUI y seleccione Debug > Start new instance .
DeVEXPress Web API Service utiliza tokens web JSON (JWT) para autorizar a los usuarios. Para obtener un token, pase el nombre de usuario y la contraseña al punto final de autenticación . En este ejemplo, la lógica de generación de token se implementa en el método 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 ) ) ;
}Incluya el token en httpclient.defaulTequestheaders. Autorización. Todas las solicitudes posteriores pueden acceder a puntos finales y datos privados:
HttpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , await tokenResponse . Content . ReadAsStringAsync ( ) ) ;Archivo para ver: Webapiservice.cs
Implementamos los siguientes puntos finales personalizados en el servicio WebApi :
El punto final candeletepost le permite enviar una solicitud desde un dispositivo móvil al servicio y verificar si el usuario actual puede eliminar las publicaciones. Esto le permite mostrar/ocultar el botón Eliminar en la interfaz de usuario.
Archivo para mirar: updater.cs
El punto final de CurrentUser devuelve información sobre el usuario autenticado.
Archivo para mirar: updater.cs
GetAuthorImage Endpoint recupera una imagen de autor por ID de usuario.
Archivo para mirar: updater.cs
El punto final GetPosTimage recupera una imagen por ID de publicación.
Archivo para mirar: updater.cs
El método Updater.UpdateDatabaseAfterUpdateSchema genera usuarios y especifica sus credenciales de inicio de sesión. Puede modificar la contraseña de un usuario directamente en la base de datos. Nota: Nuestro marco de aplicaciones .NET multiplataforma (XAF UI) le permite construir rápidamente un escritorio o interfaz de usuario web que accede a la misma base de datos.
Archivo para mirar: updater.cs
PermissionPolicyRole Objetos en la clase Updater Agregue permisos de usuario. El siguiente fragmento de código llama al método AddObjectPermissionFromLambda para configurar el rol de "Visor" (permita que el usuario lea publicaciones publicadas):
role . AddObjectPermissionFromLambda ( SecurityOperations . Read , p => p . IsPublished , SecurityPermissionState . Allow ) ;Archivo para mirar: updater.cs
El método AddTypePermissionsRecursively modifica los privilegios para el rol de "Editor" (Alex, Antony y Dennis). El método agrega permisos RRUD (crear, leer, actualizar, eliminar) para el tipo Post :
role . AddTypePermissionsRecursively < Post > ( SecurityOperations . Read | SecurityOperations . Write | SecurityOperations . Create | SecurityOperations . DeleteObject , SecurityPermissionState . Allow ) ;Archivo para mirar: updater.cs
Use TextEdit.starticon y PasswordEdit.Starticon Propiedades para mostrar iconos en los controles TextEdit y PasswordEdit.
< dxe : TextEdit LabelText = " Login " StartIcon = " editorsname " .../>
< dxe : PasswordEdit LabelText = " Password " StartIcon = " editorspassword " .../>Archivo para ver: LoginPage.xaml
Para validar la entrada del usuario en el control PasswordEdit, use EditBase.haserror y EditBase.Errortext Propiedades heredadas.
< dxe : PasswordEdit ... HasError = " {Binding HasError} " ErrorText = " {Binding ErrorText} " />Archivo para ver: 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 > ( ) ;
}
}Archivo para ver: LoginViewModel.cs
Especifique la propiedad hereditaria TextEdit.ReturnType para enfocar el control PasswordEdit después de editar el valor del control TextEdit.
Use la propiedad PasswordEdit.returnCommand para especificar un comando ( inicio de sesión ) que se ejecuta cuando un usuario ingresa la contraseña:
< dxe : PasswordEdit ReturnCommand = " {Binding LoginCommand} " />Archivo para ver: 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 ; }
// ...
}Archivo para ver: LoginViewModel.cs
Habilitamos el almacenamiento en caché de imágenes en este proyecto. Para lograr eso, necesitábamos identificar imágenes por su URI. Para crear un URI, utilizamos una multibinding que obtenga el nombre del host y el autor/Post ID. Para obtener información adicional sobre el almacenamiento en caché de imágenes, consulte la documentación de 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 >Archivo para ver: itemsPage.xaml
El emulador de Android y el simulador iOS solicitan un certificado para acceder a un servicio a través de HTTPS. En este ejemplo, cambiamos a HTTP en modo de depuración:
#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 >Esto le permite evitar la verificación del certificado sin la necesidad de crear un certificado de desarrollo o implementar los controladores HTTPClient.
Para obtener más información, consulte Connect a los servicios web locales de emuladores de Android y simuladores iOS.
Le recomendamos que use HTTP solo cuando desarrolle/depugga su aplicación. En producción, use HTTP por razones de seguridad.
(Será redirigido a Devexpress.com para enviar su respuesta)