Este exemplo usa nosso serviço gratuito .NET App Security & Web API Service para implementar a autenticação e o acesso a dados baseados em funções. Executamos um assistente embutido para gerar um serviço de autenticação pronto para uso. Este serviço usa o Entity Framework Core para acessar um banco de dados. Um aplicativo .NET MAUI envia solicitações ao serviço de API da Web para obter ou modificar dados.

Se você é novo no Devexpress .NET App Security & Web API Service, convém revisar os seguintes recursos:
Crie um aplicativo de API da Web independente
Uma solução de 1 clique para API da Web CRUD com controle de acesso baseado em função via EF Core & Asp.net
SQL Server, se você executar esta solução no Windows.
Execute o Visual Studio como administrador e abra a solução. Os privilégios do administrador permitem que o IDE crie um banco de dados quando você executa o projeto de serviço da web.
Selecione WebApi no menu suspenso depuração . Essa opção permite que o Kestrel seja o servidor da web para o depuração.

Se você preferir o IIS Express a Kestrel, selecione IIS Express no menu suspenso Debug . Use um editor de texto externo para adicionar o seguinte 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 > Clique com o botão direito do mouse no projeto MAUI , escolha Set as Startup Project e selecione seu emulador. Observe que os dispositivos físicos anexados ao USB não podem acessar o host local da sua máquina.
Clique com o botão direito do mouse no projeto WebAPI e selecione Debug > Start new instance .
Clique com o botão direito do mouse no projeto MAUI e selecione Debug > Start new instance .
O DevexPress Web API Service usa o JSON Web Tokens (JWT) para autorizar os usuários. Para obter um token, passe o nome de usuário e a senha para o final do autenticar . Neste exemplo, a lógica de geração de token é implementada no 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 ) ) ;
}Inclua o token em httpclient.defaultReCeStesters.authorization. Todas as solicitações subsequentes podem acessar pontos de extremidade e dados privados:
HttpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , await tokenResponse . Content . ReadAsStringAsync ( ) ) ;Arquivo para ver: webapiservice.cs
Implementamos os seguintes pontos de extremidade personalizados no serviço WebApi :
O terminal CandEletePost permite que você envie uma solicitação de um dispositivo móvel para o serviço e verifique se o usuário atual pode excluir postagens. Isso permite que você mostre/oculte o botão Excluir na interface do usuário.
Arquivo para ver: Updater.cs
O ponto final do CurrentUser retorna informações sobre o usuário autenticado.
Arquivo para ver: Updater.cs
O endpoint getAuthorImage recupera uma imagem do autor por ID do usuário.
Arquivo para ver: Updater.cs
O endpoint getPostimage recupera uma imagem por ID post.
Arquivo para ver: Updater.cs
O método Updater.UpdateDatabaseAfterUpdateSchema gera usuários e especifica suas credenciais de login. Você pode modificar a senha de um usuário diretamente no banco de dados. Nota: Nossa estrutura de aplicativo .NET de plataforma cruzada (UI XAF) permite criar rapidamente uma área de trabalho ou interface da web que acessa o mesmo banco de dados.
Arquivo para ver: Updater.cs
PermissionPolicyRole Objetos na classe Updater Adicionar permissões de usuário. O snippet de código a seguir chama o método AddObjectPermissionFromLambda para configurar a função "Visualizador" (permita que o usuário leia as postagens publicadas):
role . AddObjectPermissionFromLambda ( SecurityOperations . Read , p => p . IsPublished , SecurityPermissionState . Allow ) ;Arquivo para ver: Updater.cs
A AddTypePermissionsRecursively o método modifica os privilégios da função "Editor" (Alex, Antony e Dennis). O método adiciona permissões CRUD (Criar, ler, atualizar, excluir) para o tipo Post :
role . AddTypePermissionsRecursively < Post > ( SecurityOperations . Read | SecurityOperations . Write | SecurityOperations . Create | SecurityOperations . DeleteObject , SecurityPermissionState . Allow ) ;Arquivo para ver: Updater.cs
Use textedit.starticon e wastededit.starticon Properties para exibir ícones nos controles TextEdit e PASSASTEDIT.
< dxe : TextEdit LabelText = " Login " StartIcon = " editorsname " .../>
< dxe : PasswordEdit LabelText = " Password " StartIcon = " editorspassword " .../>Arquivo para olhar: loginpage.xaml
Para validar a entrada do usuário no controle PASSASTEDIT, use as propriedades herdadas EditBase.Haserror e EditBase.erRorText.
< dxe : PasswordEdit ... HasError = " {Binding HasError} " ErrorText = " {Binding ErrorText} " />Arquivo para olhar: 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 > ( ) ;
}
}Arquivo para olhar: LoginViewModel.cs
Especifique a propriedade herdada textEdit.returntype para focar o controle PASSASTEDIT depois que o valor do Controle do TextEdit for editado.
Use a propriedade PASSAWIDIT.RETURNCOMAND para especificar um comando ( login ) que é executado quando um usuário inserir a senha:
< dxe : PasswordEdit ReturnCommand = " {Binding LoginCommand} " />Arquivo para olhar: 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 ; }
// ...
}Arquivo para olhar: LoginViewModel.cs
Ativamos o cache de imagens neste projeto. Para conseguir isso, precisávamos identificar imagens por seu URI. Para criar um URI, usamos uma multibinding que obtém o nome do host e o autor/ID da postagem. Para obter informações adicionais sobre o cache de imagens, consulte a documentação do 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 >Arquivo para olhar: itemspage.xaml
O Emulador Android e o simulador iOS solicitam um certificado para acessar um serviço sobre HTTPS. Neste exemplo, mudamos para HTTP no modo de depuração:
#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 >Isso permite ignorar a verificação de certificado sem a necessidade de criar um certificado de desenvolvimento ou implementar manipuladores HTTPClient.
Para obter mais informações, consulte Conecte -se aos serviços da Web local de emuladores Android e simuladores iOS.
Recomendamos que você use o HTTP apenas quando desenvolver/depurar seu aplicativo. Na produção, use HTTPS por razões de segurança.
(Você será redirecionado para Devexpress.com para enviar sua resposta)