Demonstra Passo a passo: Usando os serviços de aplicativo do cliente

Este tópico descreve como criar um aplicativos do Windows que usa serviços aplicativo cliente para autenticar usuários e recuperar funções de usuário e configurações.

Nesta explicação passo a passo, você executa as seguintes tarefas:

  • Criar um aplicativo Formulários do Windows e use o projeto Designer Visual Studio para habilitar e configurar serviços aplicativo cliente.

  • Crie um aplicativo simples de Serviço da Web do ASP.NET para hospedar os serviços de aplicativo e testar a configuração do cliente.

  • Adicione a autenticação de formulários ao seu aplicativo. Você irá iniciar usando um nome de usuário e uma senha embutida para testar o serviço. Em seguida, você adicionará um formulário de logon, especificando-o como um provedor de credenciais na configuração do aplicativo.

  • Adicione a funcionalidade baseada em função, habilitando e exibindo um botão somente para os usuários na função de "Gerente".

  • Acessar Configurações da Web. Você irá iniciar carregando configurações para um usuário autenticado (teste) na página Settings do criador do projeto da Web. Em seguida, você usará o Windows Forms Designer para ligar uma caixa de texto a uma configuração da Web. Finalmente, você salvará o valor modificado de volta para o servidor.

  • Implemente logout. Você adicionará uma opção Logoff para o formulário e chamará um método logout.

  • Ativar modo off-line. Você irá fornecer uma caixa de seleção para que os usuários possam especificar seus status de conexão. Em seguida, você usará esse valor para especificar se os provedores de serviço de aplicativos cliente usará localmente dados armazenados em cache em vez de acessar os serviços da Web. Finalmente, você vai autenticar novamente o usuário atual quando o aplicativo retorna ao modo online.

Pré-requisitos

Para concluir este passo a passo, você precisará da componente a seguir:

  • Visual Studio 2008.

Criando um aplicativo cliente

A primeira coisa que você vai fazer é criar um projeto Formulários do Windows. Essa explicação passo a passo usa Formulários do Windows porque mais pessoas estão familiarizadas, mas o processo é semelhante para projetos Windows Presentation Foundation (WPF).

Para criar um aplicativo cliente e habilitar serviços aplicativo cliente.

  1. Em Visual Studio, selecione o arquivo | Novo | Projeto a opção de menu.

  2. Na caixa de diálogo New Project, no painel Project types, expanda o Visual Basic ou Visual C# e selecione o tipo de projeto Windows.

  3. Verifique se .NET Framework 3.5 está selecionada e, em seguida, selecione o modelo Windows Forms Application.

  4. Altere o projeto Name para ClientAppServicesDemo e em seguida, clique em OK .

    Um novo projeto Formulários do Windows é aberto no Visual Studio.

  5. No menu Project, selecione ClientAppServicesDemo Properties.

    O Project Designer aparecerá.

  6. Na guia Services, selecione Enable client application services.

  7. Certifique-se que Use Forms authentication está selecionada e, em seguida, defina Authentication service location, Roles service location e Web settings service location para https://localhost:55555/AppServices.

  8. Para Visual Basic, na guia Application, defina Authentication mode para Application-defined.

O designer armazena as configurações especificadas no arquivo app.config do aplicativo.

Neste ponto, o aplicativo está configurado para acessar todos os três serviços do mesmo host. Na próxima seção, você criará o host como um aplicativo simples serviço Web, permitindo que você teste a configuração do cliente.

Criando o host de serviços de aplicativos

Nesta seção, você irá criar um aplicativo de serviço da Web simples que acessa os dados de usuário de um local SQL Server Compact 3.5 arquivo de banco de dados. Em seguida, você preencherá o banco de dados usando o Ferramenta de Admnistração de Web Site ASP.NET. Essa configuração simple permite que você teste rapidamente o seu aplicativo cliente. Como alternativa, você pode configurar o serviço host da Web para acessar os dados de usuário de um banco de dados de SQL Server completo ou personalizado MembershipProvider e RoleProvider classes. Para obter mais informações, consulte Criando e configurando o banco de dados dos Serviços de Aplicativos para o SQL Server.

No procedimento a seguir, você cria e configura o serviço Web AppServices.

Para criar e configurar o aplicativo Serviços do host

  1. Em Solution Explorer,selecione a solução ClientAppServicesDemo e em seguida, no menu File, selecione Add | New Project.

  2. Na caixa de diálogo New Project, no painel Project types, expanda o Visual Basic ou Visual C# e selecione o tipo de projeto Windows.

  3. Verifique se .NET Framework 3.5 está selecionada e, em seguida, selecione o modelo ASP.NET Web Service Application.

  4. Altere o projeto Name para AppServices e em seguida, clique em OK .

    Uma nova página ASP.Projeto de aplicativo Web do NET service é adicionado à solução e o arquivo Service1 ou Service1.asmx.cs aparece no editor.

    ObservaçãoObservação

    O arquivo Service1 ou Service1.asmx.cs não é usado neste exemplo. Se você quiser manter organizada a seu ambiente de trabalho, você pode fechá-la e excluí-lo de Solution Explorer.

  5. Em Solution Explorer selecione o projeto AppServices e em seguida no menu Project, selecione AppServices Properties.

    O Project Designer aparecerá.

  6. Na guia Web, certifique-se que Use Visual Studio Development Server está selecionada.

  7. Selecione Specific port, especifique um valor de 55555 e, em seguida, defina Virtual path /AppServices.

  8. Salve todos os arquivos.

  9. Em Solution Explorer, abra web.config e localize a marca de abertura <system.web>.

  10. Adicione a seguinte marcação antes da marca <system.web>.

    Os elementos authenticationService, profileService, roleService nessa marcação habilita e configura os serviços de aplicativo. Para fins de teste, o atributo requireSSL do elemento authenticationService é definido como "false". Os atributos readAccessProperties e writeAccessProperties do elemento profileService indicam que a propriedade WebSettingsTestText é leitura/gravação.

    ObservaçãoObservação

    No código de produção, você sempre deve acessar o serviço de autenticação sobre a camada Soquetes Seguros (SSL, usando o protocolo HTTPS). Para obter informações adicionais sobre como configurar a SSL, consulte Configuring Secure Sockets Layer (IIS 6.0 Operations Guide).

    <system.web.extensions>
      <scripting>
        <webServices>
          <authenticationService enabled="true" requireSSL = "false"/>
          <profileService enabled="true"
            readAccessProperties="WebSettingsTestText"
            writeAccessProperties="WebSettingsTestText" />
          <roleService enabled="true"/>
        </webServices>
      </scripting>
    </system.web.extensions>
    
  11. Adicione a marcação a seguir após a <system.web> marca de abertura para que ele está dentro do elemento <system.web>.

    O elemento profile configura uma única configuração Web denominada WebSettingsTestText.

    <profile enabled="true" >
      <properties>
        <add name="WebSettingsTestText" type="string" 
          readOnly="false" defaultValue="DefaultText" 
          serializeAs="String" allowAnonymous="false" />
      </properties>
    </profile>
    

No procedimento a seguir, você pode usar o ASP.NET a ferramenta Web Site Administration para concluir a configuração do serviço e preencha o arquivo de banco de dados local. Você adicionará dois usuários chamados funcionário e manager que pertencem a duas funções com nomes iguais. As senhas de usuário são funcionário! e manager! respectivamente.

Para configurar a associação e funções

  1. Em Solution Explorer, selecione o projeto de AppServices e, em seguida, o projeto menu, selecione ASP.Configuração de rede.

    O ASP.NET Web Site Administration Tool aparece.

  2. Sobre o Security , clique em Use the security Setup Wizard to configure security step by step.

    O O Assistente para configuração de segurança aparece e exibe o boas-vindas etapa.

  3. Clique em Next.

    O Selecionar método de acesso etapa é exibida.

  4. Selecione da internet. Isso configura o serviço para usar a autenticação de formulários em vez da autenticação do Windows.

  5. Clique em próximo duas vezes.

    O Definir funções etapa é exibida.

  6. Selecione Enable roles for this Web site.

  7. Clique em Next. O Criar nova função formulário é exibido.

  8. No Nome da nova função caixa de texto, digite manager e, em seguida, clique em Adicionar função.

    O Funções existentes tabela aparece com o valor especificado.

  9. No Nome da nova função caixa de texto, substituir manager com funcionário e, em seguida, clique em Adicionar função.

    O novo valor aparece no Funções existentes tabela.

  10. Clique em Next.

    O Adicionar novos usuários etapa é exibida.

  11. No Create User formulário, especifique os seguintes valores.

    Nome de usuário

    Gerenciador

    Password (senha)

    Gerenciador!

    Confirmar senha

    Gerenciador!

    E-mail

    Manager@contoso.com

    Pergunta de Segurança

    Gerenciador

    Resposta de Segurança

    Gerenciador

  12. Clique em Create User.

    Aparece uma mensagem de sucesso.

    ObservaçãoObservação

    O email, A pergunta de segurança, e Resposta de segurança valores são exigidos pelo formulário, mas não são usados neste exemplo.

  13. Clique em Continue.

    O Create User formulário reaparece.

  14. No Create User formulário, especifique os seguintes valores.

    Nome de usuário

    funcionário

    Password (senha)

    funcionário!

    Confirmar senha

    funcionário!

    E-mail

    Employee@contoso.com

    Pergunta de Segurança

    Funcionário

    Resposta de Segurança

    funcionário

  15. Clique em Create User.

    Aparece uma mensagem de sucesso.

  16. Clique em Finish.

    O web site Administration Tool reaparece.

  17. Clique em usuários de Gerenciador.

    A lista de usuários é exibida.

  18. Clique em Editar funções para o funcionário usuário e, em seguida, selecione o funcionário função.

  19. Clique em Editar funções para o manager usuário e, em seguida, selecione o manager função.

  20. Feche a janela do navegador que hospeda o web site Administration Tool.

  21. Se uma caixa de mensagem aparecer perguntando se você deseja recarregar o arquivo Web. config modificado, clique em Sim.

Isso conclui a instalação do serviço Web. Neste ponto, você pode pressionar F5 para executar o aplicativo cliente, e a ASP.NET Development Server iniciará automaticamente com o aplicativo cliente. O servidor continuará a executar após você sair do aplicativo, mas será reiniciado quando você reiniciar o aplicativo. Isso permite que ele detecte quaisquer alterações feitas no web.config.

Para parar o servidor manualmente, clique com o botão direito do mouse no ícone do Servidor de Desenvolvimento do ASP.NET na área de notificação da barra de tarefas e, em seguida, clique em Stop. Isso é útil ocasionalmente para certificar-se que uma reinicialização limpa ocorra.

Adicionando a autenticação por formulários

No procedimento a seguir, você adicionará código ao formulário principal que tenta validar o usuário e nega acesso quando o usuário fornece credenciais inválidas. Você usa um nome de usuário e uma senha embutida para testar o serviço.

Para validar o usuário em seu código do aplicativo

  1. Em Solution Explorer, no projeto ClientAppServicesDemo, adicione uma referência ao conjunto System.Web.

  2. Selecione o arquivo Form1 e, em seguida, selecione View | Code do menu principal Visual Studio.

  3. Na editor de códigos, adicione as instruções a seguir à parte superior do arquivo Form1.

    Imports System.Net
    Imports System.Threading
    Imports System.Web.ClientServices
    Imports System.Web.ClientServices.Providers
    Imports System.Web.Security
    
    using System.Net;
    using System.Threading;
    using System.Web.ClientServices;
    using System.Web.ClientServices.Providers;
    using System.Web.Security;
    
  4. Em Solution Explorer, clique duas vezes em Form1 para exibir o designer.

  5. No Criador, clique duas vezes na superfície de formulário para gerar um manipulador de eventos Form.Load chamado Form1_Load.

    O editor de códigos é exibido com o cursor no método Form1_Load.

  6. Adicione o seguinte código ao método Form1_Load.

    Esse código nega acesso a usuários não autenticados saindo do aplicativo. Como alternativa, você poderia permitir que usuários não autenticados acessem o formulário, mas negar o acesso à funcionalidade específica. Normalmente, você não irá embutir o nome de usuário e a senha desta forma, mas é útil para fins de teste. Na próxima seção, você substituirá esse código por um mais robusto que exibe um caixa de diálogo de login e inclui manipulação de exceção.

    Observe que o método static Membership.ValidateUser está na caixa .NET Framework versão 2.0. Este método delega seu trabalho para o provedor de autenticação configurado e retorna true se a autenticação for bem-sucedida. O aplicativo não exige uma referência direta para o provedor de autenticação do cliente.

    If Not Membership.ValidateUser("manager", "manager!") Then
    
        MessageBox.Show("Unable to authenticate.", "Not logged in", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        Application.Exit()
    
    End If
    
    if (!Membership.ValidateUser("manager", "manager!"))
    {
        MessageBox.Show("Unable to authenticate.", "Not logged in",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
    }
    

Você pode agora pressionar F5 para executar o aplicativo, e po você fornecer um nome de usuário e senha corretos, você verá o formulário.

ObservaçãoObservação

Se você não puder executar o aplicativo, tente interromper o Servidor de Desenvolvimento do ASP.NET. Quando o servidor for reiniciado, verifique se a porta está definida para 55555.

Para ver a mensagem de erro em vez disso, altere os parâmetros ValidateUser. Por exemplo, substitua o parâmetro "manager!" com uma senha incorreta, como "MANAGER".

Adicione um formulário de logon como um provedor credenciais

Você pode adquirir as credenciais do usuário em seu código do aplicativo e passá-las para o método ValidateUser. No entanto, geralmente é útil manter seu código de adquirir credenciais separado do seu código do aplicativo, caso você queira alterá-lo mais tarde.

No procedimento a seguir, você configura seu aplicativo para usar um provedor de credenciais e altera a chamada de método ValidateUser para passar Empty para ambos os parâmetros. As sequências de caracteres vazias sinalizam o método ValidateUser para chamar o método GetCredentials do provedor de credenciais configurado.

Para configurar seu aplicativo para usar um provedor de credenciais

  1. Em Solution Explorer selecione o projeto ClientAppServicesDemo, e em seguida, no menu Project, selecione ClientAppServicesDemo Properties.

    O Project Designer aparecerá.

  2. Sobre o serviços guia, defina opcional: Provedor de credenciais o seguinte valor. Esse valor indica o nome do tipo conjunto-qualificado.

    ClientAppServicesDemo.Login, ClientAppServicesDemo
    
  3. No arquivo de código Form1, substitua o código no método Form1_Load com o código a seguir.

    Esse código exibe uma mensagem de boas-vindas e, em seguida, chama o método ValidateUsingCredentialsProvider que você irá adicionar na próxima etapa. Se o usuário não é autenticado, o método ValidateUsingCredentialsProvider retorna false e o método Form1_Load retorna. Isso impede que qualquer código adicional sejam executados antes de sair do aplicativo. A mensagem de boas-vindas é útil para tornar claro quando o aplicativo for reiniciado. Você adicionará código para reiniciar o aplicativo quando você implementa logout posteriormente nessa explicação passo a passo.

    MessageBox.Show("Welcome to the Client Application Services Demo.", _
        "Welcome!")
    
    If Not ValidateUsingCredentialsProvider() Then Return
    
    MessageBox.Show("Welcome to the Client Application Services Demo.",
        "Welcome!");
    
    if (!ValidateUsingCredentialsProvider()) return;
    
  4. Adicione o seguinte método após o método Form1_Load.

    Este método passa sequências vazias para o método static Membership.ValidateUser, que faz com que a caixa de diálogo de logon seja exibida. Se o serviço de autenticação não estiver disponível, o método ValidateUser irá acionar um WebException. Nesse caso, o método ValidateUsingCredentialsProvider exibe um mensagem de aviso e pergunta se o usuário deseja tentar novamente no modo off-line. Esta funcionalidade requer o recurso Save password hash locally to enable offline login descrito em Como: Configura os serviços de aplicativo do cliente. Esse recurso é habilitado por padrão para novos projetos.

    Se o usuário não é validado, o método ValidateUsingCredentialsProvider exibe um mensagem de erro e sai do aplicativo. Finalmente, esse método retorna o resultado da tentativa de autenticação.

    Private Function ValidateUsingCredentialsProvider() As Boolean
    
        Dim isAuthorized As Boolean = False
    
        Try
    
            ' Call ValidateUser with empty strings in order to display the 
            ' login dialog box configured as a credentials provider.
            isAuthorized = Membership.ValidateUser( _
                String.Empty, String.Empty)
    
        Catch ex As System.Net.WebException
    
            If DialogResult.OK = MessageBox.Show( _
                "Unable to access the authentication service." & _
                Environment.NewLine & "Attempt login in offline mode?", _
                "Warning", MessageBoxButtons.OKCancel, _
                MessageBoxIcon.Warning) Then
    
                ConnectivityStatus.IsOffline = True
                isAuthorized = Membership.ValidateUser( _
                    String.Empty, String.Empty)
    
            End If
    
        End Try
    
        If Not isAuthorized Then
    
            MessageBox.Show("Unable to authenticate.", "Not logged in", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
            Application.Exit()
    
        End If
    
        Return isAuthorized
    
    End Function
    
    private bool ValidateUsingCredentialsProvider()
    {
        bool isAuthorized = false;
        try
        {
            // Call ValidateUser with empty strings in order to display the 
            // login dialog box configured as a credentials provider.
            isAuthorized = Membership.ValidateUser(
                String.Empty, String.Empty);
        }
        catch (System.Net.WebException)
        {
            if (DialogResult.OK == MessageBox.Show(
                "Unable to access the authentication service." +
                Environment.NewLine + "Attempt login in offline mode?",
                "Warning", MessageBoxButtons.OKCancel, 
                MessageBoxIcon.Warning))
            {
                ConnectivityStatus.IsOffline = true;
                isAuthorized = Membership.ValidateUser(
                    String.Empty, String.Empty);
            }
        }
    
        if (!isAuthorized)
        {
            MessageBox.Show("Unable to authenticate.", "Not logged in",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.Exit();
        }
        return isAuthorized;
    }
    

Criando um formulário de logon

Um provedor de credenciais é uma classe que implementa a interface IClientFormsAuthenticationCredentialsProvider. Essa interface possui um único método chamado GetCredentials que retorna um objeto ClientFormsAuthenticationCredentials. Os procedimentos a seguir descrevem como criar um caixa de diálogo de logon que implementa GetCredentials para exibir próprio e retornar as credenciais User-specified.

Procedimentos separados são fornecidos para Visual Basic e C# porque Visual Basic fornece um modelo formulário de logon . Isso economiza tempo e esforço de codificação.

Para criar um caixa de diálogo de logon como um provedor de credenciais em Visual Basic

  1. Em Solution Explorer selecione o projeto ClientAppServicesDemo, e em seguida, no menu Project, selecione Add New Item.

  2. Na caixa Add New Item, selecione o modelo Login Form altere o item Name para Login.vb e em seguida, clique em Add.

    A caixa de diálogo de logon aparece na Windows Forms Designer.

  3. No Designer, selecione o botão OK e, em seguida, na janela Properties, defina DialogResult para OK.

  4. No designer, adicione um controle CheckBox ao formulário sob a caixa de texto Password.

  5. No Propriedades janela, especifique um (nome) valor de rememberMeCheckBox e um texto valor de &Remember me.

  6. Selecione View | Code do Visual Studio menu principal.

  7. Na editor de códigos, adicione o seguinte código à parte superior do arquivo.

    Imports System.Web.ClientServices.Providers
    
  8. Modifice a Assinatura de classe para que a classe implemente a interface IClientFormsAuthenticationCredentialsProvider.

    Public Class Login
        Implements IClientFormsAuthenticationCredentialsProvider
    
  9. Certifique-se que o cursor seja após IClientformsAuthenticationCredentialsProvider e pressione ENTER para gerar o método GetCredentials.

  10. Localize a implementação GetCredentials e substituia com o código a seguir.

    Public Function GetCredentials() As  _
        ClientFormsAuthenticationCredentials Implements _
        IClientFormsAuthenticationCredentialsProvider.GetCredentials
    
        If Me.ShowDialog() = DialogResult.OK Then
            Return New ClientFormsAuthenticationCredentials( _
                UsernameTextBox.Text, PasswordTextBox.Text, _
                rememberMeCheckBox.Checked)
        Else
            Return Nothing
        End If
    
    End Function
    

O Procedimento C# a seguir fornece o código todo a listando para um login simples na caixa de diálogo. O layout para esta caixa de diálogo é um pouco crua, mas o importante é a Implementação GetCredentials.

Para criar um caixa de diálogo de logon como um provedor de credenciais em C#

  1. Em Solution Explorer selecione o projeto AppServices e em seguida no menu Project, selecione Add Class.

  2. Na caixa Add New Item, altere o Name para Login.cs e em seguida, clique em Add.

    O arquivo Login.cs abre no editor de códigos.

  3. Substitua o código a seguir com o código padrão.

    using System.Windows.Forms;
    using System.Web.ClientServices.Providers;
    
    namespace ClientAppServicesDemo
    {
        class Login : Form,
            IClientFormsAuthenticationCredentialsProvider
        {
            private TextBox usernameTextBox;
            private TextBox passwordTextBox;
            private CheckBox rememberMeCheckBox;
            private Button OK;
            private Button cancel;
            private Label label1;
            private Label label2;
    
            public ClientFormsAuthenticationCredentials GetCredentials()
            {
                if (this.ShowDialog() == DialogResult.OK)
                {
                    return new ClientFormsAuthenticationCredentials(
                        usernameTextBox.Text, passwordTextBox.Text,
                        rememberMeCheckBox.Checked);
                }
                else
                {
                    return null;
                }
            }
    
            public Login()
            {
                InitializeComponent();
            }
    
            private void CloseForm(object sender, System.EventArgs e)
            {
                this.Close();
            }
    
            private void InitializeComponent()
            {
                this.label1 = new System.Windows.Forms.Label();
                this.usernameTextBox = new System.Windows.Forms.TextBox();
                this.label2 = new System.Windows.Forms.Label();
                this.passwordTextBox = new System.Windows.Forms.TextBox();
                this.rememberMeCheckBox = new System.Windows.Forms.CheckBox();
                this.OK = new System.Windows.Forms.Button();
                this.cancel = new System.Windows.Forms.Button();
                this.SuspendLayout();
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(13, 13);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(58, 13);
                this.label1.TabIndex = 0;
                this.label1.Text = "&User name";
                // 
                // usernameTextBox
                // 
                this.usernameTextBox.Location = new System.Drawing.Point(13, 30);
                this.usernameTextBox.Name = "usernameTextBox";
                this.usernameTextBox.Size = new System.Drawing.Size(157, 20);
                this.usernameTextBox.TabIndex = 1;
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(13, 57);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(53, 13);
                this.label2.TabIndex = 2;
                this.label2.Text = "&Password";
                // 
                // passwordTextBox
                // 
                this.passwordTextBox.Location = new System.Drawing.Point(13, 74);
                this.passwordTextBox.Name = "passwordTextBox";
                this.passwordTextBox.PasswordChar = '*';
                this.passwordTextBox.Size = new System.Drawing.Size(157, 20);
                this.passwordTextBox.TabIndex = 3;
                // 
                // rememberMeCheckBox
                // 
                this.rememberMeCheckBox.AutoSize = true;
                this.rememberMeCheckBox.Location = new System.Drawing.Point(13, 101);
                this.rememberMeCheckBox.Name = "rememberMeCheckBox";
                this.rememberMeCheckBox.Size = new System.Drawing.Size(94, 17);
                this.rememberMeCheckBox.TabIndex = 4;
                this.rememberMeCheckBox.Text = "&Remember me";
                this.rememberMeCheckBox.UseVisualStyleBackColor = true;
                // 
                // OK
                // 
                this.OK.DialogResult = System.Windows.Forms.DialogResult.OK;
                this.OK.Location = new System.Drawing.Point(13, 125);
                this.OK.Name = "OK";
                this.OK.Size = new System.Drawing.Size(75, 23);
                this.OK.TabIndex = 5;
                this.OK.Text = "&OK";
                this.OK.UseVisualStyleBackColor = true;
                // 
                // cancel
                // 
                this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
                this.cancel.Location = new System.Drawing.Point(95, 125);
                this.cancel.Name = "cancel";
                this.cancel.Size = new System.Drawing.Size(75, 23);
                this.cancel.TabIndex = 6;
                this.cancel.Text = "&Cancel";
                this.cancel.UseVisualStyleBackColor = true;
                // 
                // Login
                // 
                this.AcceptButton = this.OK;
                this.CancelButton = this.cancel;
                this.ClientSize = new System.Drawing.Size(187, 168);
                this.Controls.Add(this.cancel);
                this.Controls.Add(this.OK);
                this.Controls.Add(this.rememberMeCheckBox);
                this.Controls.Add(this.passwordTextBox);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.usernameTextBox);
                this.Controls.Add(this.label1);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
                this.MaximizeBox = false;
                this.MinimizeBox = false;
                this.Name = "Login";
                this.Text = "Login";
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
        }
    
    }
    

Agora você pode executar o aplicativo e ver a caixa de diálogo de logon apareçer. Para testar esse código, tente diferentes credenciais válidas e inválidas e confirme que você pode acessar o formulário somente com as credenciais válidas. Nomes de usuário válidos são funcionário e manager com senhas funcionário! e manager! respectivamente.

ObservaçãoObservação

Não selecione Remember me neste momento ou você não poderá fazer logon como outro usuário até que mais tarde você implemente essa explicação passo a passo de logout.

Adicionando funcionalidade baseada em função

No procedimento a seguir, você adicionará um botão ao formulário e exibi-lo somente para usuários na função de gerente.

Para alterar o interface do usuário com base na função de usuário

  1. Em Solution Explorer,no ClientAppServicesDemo projeto, selecione Form1 e, em seguida, selecione View | Designer no menu principal Visual Studio.

  2. No designer, adicione um controle Button ao formulário da ToolBox.

  3. Na janela Properties, defina as seguintes propriedades para o botão.

    Propriedade

    Valor

    (Name)

    managerOnlyButton

    Texto

    &Manager task

    Visible

    False

  4. Na editor de códigos de Form1, adicione o seguinte código ao final do método Form1_Load.

    Esse código chama o método DisplayButtonForManagerRole que você irá adicionar na próxima etapa.

    DisplayButtonForManagerRole()
    
    DisplayButtonForManagerRole();
    
  5. Adicione a instrução a seguir para o final do método DebitTest:

    Este método chama o método IsInRole de IPrincipal retornado pela propriedade static Thread.CurrentPrincipal. Para aplicativos configurados para usar serviços aplicativo cliente, essa propriedade retorna um ClientRolePrincipal. Como essa classe implementa a interface IPrincipal, você não precisará fazer referência a ela explicitamente.

    Se o usuário for na função de "Gerente", o método DisplayButtonForManagerRole Define a propriedade Visible de managerOnlyButton como true. Esse método também exibe um mensagem de erro se um WebException é acionada, que indica que o serviço de funções está indisponível.

    ObservaçãoObservação

    Além disso, o método IsInRole sempre retornará false se o logon do usuário expirou. Isso não ocorrerá se o aplicativo chama o método IsInRole Uma vez logo após a autenticação, como mostrado no código de exemplo para essa explicação passo a passo. Se seu aplicativo deve recuperar funções de usuário em outros momentos, convém adicionar código para revalidar usuários cujo logon tenha expirado. Se todos os usuários válidos forem atribuídos às funções, você pode determinar se o logon expirou chamando o método ClientRoleProvider.GetRolesForUser. Se nenhuma função for retornada, o logon expirou. Para obter um exemplo dessa funcionalidade, consulte o método GetRolesForUser. Essa funcionalidade só é necessária se você tiver selecionado Requer que os usuários façam logon novamente sempre que o servidor de cookie expira em sua configuração de aplicativo. Para obter mais informações, consulte Como: Configura os serviços de aplicativo do cliente.

    Private Sub DisplayButtonForManagerRole()
    
        Try
    
            If Thread.CurrentPrincipal.IsInRole("manager") Then
    
                managerOnlyButton.Visible = True
    
            End If
    
        Catch ex As System.Net.WebException
    
            MessageBox.Show("Unable to access the roles service.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End Try
    
    End Sub
    
    private void DisplayButtonForManagerRole()
    {
        try
        {
            if (Thread.CurrentPrincipal.IsInRole("manager"))
            {
                managerOnlyButton.Visible = true;
            }
        }
        catch (System.Net.WebException)
        {
            MessageBox.Show("Unable to access the role service.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    

Se a autenticação for bem-sucedida, o cliente provedor de autenticação define a propriedade Thread.CurrentPrincipal como uma instância da classe ClientRolePrincipal. Essa classe implementa o método IsInRole para que o trabalho é delegado ao provedor de função configurada. Como antes, o código do aplicativo não requer uma referência direta para o provedor de serviços.

Agora você pode executar o aplicativo e fazer logon como funcionário para ver que o botão não aparece e faça logon como gerenciador para ver o botão.

Acessar Configurações da Web

No procedimento a seguir, você adiciona uma caixa de texto para o formulário e liga para uma configuração da Web. Como o código anterior que usa a autenticação e funções, seu código de configurações não acessará o provedor de configurações diretamente. Em vez disso, ele usa a classe de alta segurança digitada Settings (acessado como Properties.Settings.Default em C# e My.Settings no Visual Basic)gerado para o seu projeto por Visual Studio.

Para usar as configurações da Web na sua interface do usuário

  1. Certifique-se de que o ASP.NET Web Development Server está ainda sendo executado, verificando a área de notificação da barra de tarefas. Se você interrompeu o servidor, reinicie o aplicativo (que inicia o servidor automaticamente), em seguida, feche a caixa de diálogo de logon.

  2. Em Solution Explorer selecione o projeto ClientAppServicesDemo, e em seguida, no menu Project, selecione ClientAppServicesDemo Properties.

    O Project Designer aparecerá.

  3. Na guia Settings,clique em Load Web Settings.

    Aparece um caixa de diálogo Login.

  4. Insira as credenciais para funcionário ou gerente e clique em Log In. A configuração da Web que você usará está configurada para acesso por usuários autenticados apenas clicando em Skip Login não carregará as configurações.

    A configuração WebSettingsTestText aparece no designer com o valor padrão do DefaultText. Além disso, uma classeSettings que contém uma propriedade WebSettingsTestText é gerada para o seu projeto.

  5. Em Solution Explorer,no ClientAppServicesDemo projeto, selecione Form1 e, em seguida, selecione View | Designer no menu principal Visual Studio.

  6. No designer, adicione um controle TextBox ao formulário.

  7. Na janela Properties, especifique um valor de (Name) webSettingsTestTextBox .

  8. Na editor de códigos, adicione o seguinte código ao final do método Form1_Load.

    Esse código chama o método BindWebSettingsTestTextBox que você irá adicionar na próxima etapa.

    BindWebSettingsTestTextBox()
    
    BindWebSettingsTestTextBox();
    
  9. Adicione a instrução a seguir para o final do método DebitTest:

    Este método vincula a propriedade Text de webSettingsTestTextBox à propriedade WebSettingsTestText da classe Settings gerada anteriormente neste procedimento. Esse método também exibe um mensagem de erro se um WebException é acionada, que indica que o serviço de funções está indisponível.

    Private Sub BindWebSettingsTestTextBox()
    
        Try
    
            Me.webSettingsTestTextBox.DataBindings.Add("Text", _
                My.Settings, "WebSettingsTestText")
    
        Catch ex As WebException
    
            MessageBox.Show("Unable to access the Web settings service.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End Try
    
    End Sub
    
    private void BindWebSettingsTestTextBox()
    {
        try
        {
            this.webSettingsTestTextBox.DataBindings.Add("Text",
                Properties.Settings.Default, "WebSettingsTestText");
        }
        catch (WebException)
        {
            MessageBox.Show("Unable to access the Web settings service.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    
    ObservaçãoObservação

    Normalmente você usará associação de dados para habilitar comunicação bidirecional automática entre um controle e uma configuração da Web. No entanto, você também pode acessar configurações da Web diretamente como mostrado no exemplo a seguir:

    webSettingsTestTextBox.Text = My.Settings.WebSettingsTestText
    
    webSettingsTestTextBox.Text =
        Properties.Settings.Default.WebSettingsTestText;
    
  10. No Designer, selecione o formulário e em seguida, na janela de Properties,clique no botão Events.

  11. Selecione o evento FormClosing e pressione ENTER para gerar um manipulador de eventos.

  12. Substitua o código gerado pelo seguinte código.

    O manipulador de eventos FormClosing chama o método SaveSettings, que também é usado pela funcionalidade logout que você irá adicionar na próxima seção. O método SaveSettings primeiro confirma que o usuário não fez fora. Ele faz isso verificando a AuthenticationType propriedade do IIdentity retornado pelo objeto atual. O principal atual é recuperado através da propriedade static CurrentPrincipal. Se o usuário foi autenticado para serviços aplicativo cliente, o tipo de autenticação será "ClientForms". O método SaveSettings Apenas não pode verificar a propriedade IIdentity.IsAuthenticated porque o usuário pode ter uma Identidade válida do Windows após logout.

    Se o usuário não tiver feito logon fora, o método SaveSettings chama o método Save da classe Settings gerado anteriormente neste procedimento. Esse método pode acionar uma WebException se o cookie de autenticação expirou. Isso ocorre apenas se você selecionou Require users to log on again whenever the server cookie expires na configuração do aplicativo. Para obter mais informações, consulte Como: Configura os serviços de aplicativo do cliente. O método SaveSettings trata de expiração do cookie chamando ValidateUser para exibir a caixa de diálogo de logon. Se o usuário fizer logon com êxito, o método SaveSettings tenta salvar as configurações novamente chamando o próprio.

    Como no código anterior, o método SaveSettings exibe um mensagem de erro se o serviço remoto não está disponível. Se o provedor Configurações não puder acessar o serviço remoto, as configurações ainda são salvas no cache local e recarregadas quando o aplicativo for reiniciado.

    Private Sub Form1_FormClosing(ByVal sender As Object, _
        ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    
        SaveSettings()
    
    End Sub
    
    Private Sub SaveSettings()
    
        ' Return without saving if the authentication type is not
        ' "ClientForms". This indicates that the user is logged out.
        If Not Thread.CurrentPrincipal.Identity.AuthenticationType _
            .Equals("ClientForms") Then Return
    
        Try
    
            My.Settings.Save()
    
        Catch ex As WebException
    
            If ex.Message.Contains("You must log on to call this method.") Then
    
                MessageBox.Show( _
                    "Your login has expired. Please log in again to save " & _
                    "your settings.", "Attempting to save settings...")
    
                Dim isAuthorized As Boolean = False
    
                Try
    
                    ' Call ValidateUser with empty strings in order to 
                    ' display the login dialog box configured as a 
                    ' credentials provider.
                    If Not Membership.ValidateUser( _
                        String.Empty, String.Empty) Then
    
                        MessageBox.Show("Unable to authenticate. " & _
                            "Settings were not saved on the remote service.", _
                            "Not logged in", MessageBoxButtons.OK, _
                            MessageBoxIcon.Error)
    
                    Else
    
                        ' Try again.
                        SaveSettings()
    
                    End If
    
                Catch ex2 As System.Net.WebException
    
                    MessageBox.Show( _
                        "Unable to access the authentication service. " & _
                        "Settings were not saved on the remote service.", _
                        "Not logged in", MessageBoxButtons.OK, _
                        MessageBoxIcon.Warning)
    
                End Try
    
            Else
    
                MessageBox.Show("Unable to access the Web settings service. " & _
                    "Settings were not saved on the remote service.", _
                    "Not logged in", MessageBoxButtons.OK, _
                    MessageBoxIcon.Warning)
    
            End If
    
        End Try
    
    End Sub
    
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        SaveSettings();
    }
    
    private void SaveSettings()
    {
        // Return without saving if the authentication type is not
        // "ClientForms". This indicates that the user is logged out.
        if (!Thread.CurrentPrincipal.Identity.AuthenticationType
          .Equals("ClientForms")) return;
    
        try
        {
            Properties.Settings.Default.Save();
        }
        catch (WebException ex)
        {
            if (ex.Message.Contains("You must log on to call this method."))
            {
                MessageBox.Show(
                    "Your login has expired. Please log in again to save " +
                    "your settings.", "Attempting to save settings...");
    
                try
                {
                    // Call ValidateUser with empty strings in order to 
                    // display the login dialog box configured as a 
                    // credentials provider.
                    if (!Membership.ValidateUser(String.Empty, String.Empty))
                    {
                        MessageBox.Show("Unable to authenticate. " +
                            "Settings were not saved on the remote service.",
                            "Not logged in", MessageBoxButtons.OK, 
                            MessageBoxIcon.Error);
                    }
                    else
                    {
                        // Try again.
                        SaveSettings();
                    }
                }
                catch (System.Net.WebException)
                {
                    MessageBox.Show(
                        "Unable to access the authentication service. " +
                        "Settings were not saved on the remote service.",
                        "Not logged in", MessageBoxButtons.OK, 
                        MessageBoxIcon.Warning);
                }
            }
            else
            {
                MessageBox.Show("Unable to access the Web settings service. " +
                    "Settings were not saved on the remote service.", 
                    "Not logged in", MessageBoxButtons.OK, 
                    MessageBoxIcon.Warning);
            }
        }
    }
    
  13. Adicione a instrução a seguir para o final do método DebitTest:

    Esse código manipula o evento ClientSettingsProvider.SettingsSaved e exibe um aviso caso qualquer uma das configurações não puderam ser salvas. O evento SettingsSaved não ocorre se o serviço Configurações não estiver disponível ou se o cookie de autenticação expirou. Um exemplo de quando o evento SettingsSaved ocorrerá é se o usuário já fez fora. Você pode testar este manipulador de eventos adicionando logout código para o método SaveSettings diretamente antes da chamada de método Save. O código logout que você pode usar é descrito na seção seguinte.

    Private WithEvents settingsProvider As ClientSettingsProvider = My.Settings _
        .Providers("System.Web.ClientServices.Providers.ClientSettingsProvider")
    
    Private Sub Form1_SettingsSaved(ByVal sender As Object, _
        ByVal e As SettingsSavedEventArgs) _
        Handles settingsProvider.SettingsSaved
    
        ' If any settings were not saved, display a list of them.
        If e.FailedSettingsList.Count > 0 Then
    
            Dim failedSettings As String = String.Join( _
                Environment.NewLine, e.FailedSettingsList.ToArray())
    
            Dim message As String = String.Format("{0}{1}{1}{2}", _
                "The following setting(s) were not saved:", _
                Environment.NewLine, failedSettings)
    
            MessageBox.Show(message, "Unable to save settings", _
                MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End If
    
    End Sub
    
    private void Form1_SettingsSaved(object sender,
        SettingsSavedEventArgs e)
    {
        // If any settings were not saved, display a list of them.
        if (e.FailedSettingsList.Count > 0)
        {
            String failedSettings = String.Join(
                Environment.NewLine,
                e.FailedSettingsList.ToArray());
    
            String message = String.Format("{0}{1}{1}{2}",
                "The following setting(s) were not saved:",
                Environment.NewLine, failedSettings);
    
            MessageBox.Show(message, "Unable to save settings",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    
  14. Para C#, adicione o seguinte código ao final do método Form1_Load. Esse código associa o método que você adicionou na última etapa com o evento SettingsSaved.

    ((ClientSettingsProvider)Properties.Settings.Default.Providers
        ["System.Web.ClientServices.Providers.ClientSettingsProvider"])
        .SettingsSaved += 
        new EventHandler<SettingsSavedEventArgs>(Form1_SettingsSaved);
    

Para testar o aplicativo neste ponto, execute várias vezes como Funcionário e Gerente e digite valores diferentes para a caixa de texto. Os valores persistirão nas sessões em uma base por usuário.

Implementando Logout

Quando o usuário seleciona Remember me ao fazer logon, o aplicativo irá automaticamente autenticar o usuário em execuções subsequentes. A autenticação automática continuará enquanto o aplicativo está no modo off-line ou até que o cookie de autenticação expira. Às vezes, no entanto, vários usuários serão necessário ter acesso do aplicativo ou um único usuário pode ocasionalmente fazer logon com credenciais diferentes. Para habilitar esse cenário, você deve implementar a funcionalidade logout, conforme descrito no procedimento o seguir.

Para implementar a funcionalidade logout

  1. No designer, adicione um controle Button ao formulário da ToolBox.

  2. No Propriedades janela, especifique um (nome) valor de logoutButton e um texto valor & logoff.

  3. Clique duas vezes no logoutButton para gerar um Click manipulador de eventos.

    O editor de códigos é exibido com o cursor no método logoutButton_Click.

  4. Substitua o método gerado logoutButton_Click pelo seguinte código.

    Esta manipulador de eventos primeiro chama o método SaveSettings que você adicionou na seção anterior. Em seguida, o manipulador de eventos chama o método ClientFormsAuthenticationMembershipProvider.Logout. Se o serviço de autenticação não estiver disponível, o método Logout irá acionar um WebException. Nesse caso, o método logoutButton_Click exibe um mensagem de aviso e muda temporariamente para o modo off-line para logoff do usuário. O Modo off-line é descrito na próxima seção.

    Logout exclui o cookie de autenticação local para que esse logon seja necessária quando o aplicativo for reiniciado. Após logout, o manipulador de eventos reinicia o aplicativo. Quando o aplicativo for reiniciado, ele exibe a mensagem Bem-vindo seguida de caixa de diálogo de logon. A mensagem de boas-vindas deixa claro que o aplicativo foi reiniciado. Isso evita confusão potencial se o usuário deverá fazer para salvar as configurações e em seguida, faça logon novamente porque o aplicativo foi reiniciado.

    Private Sub logoutButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles logoutButton.Click
    
        SaveSettings()
    
        Dim authProvider As ClientFormsAuthenticationMembershipProvider = _
            CType(System.Web.Security.Membership.Provider,  _
            ClientFormsAuthenticationMembershipProvider)
    
        Try
    
            authProvider.Logout()
    
        Catch ex As WebException
    
            MessageBox.Show("Unable to access the authentication service." & _
                Environment.NewLine & "Logging off locally only.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            ConnectivityStatus.IsOffline = True
            authProvider.Logout()
            ConnectivityStatus.IsOffline = False
    
        End Try
    
        Application.Restart()
    
    End Sub
    
    private void logoutButton_Click(object sender, EventArgs e)
    {
        SaveSettings();
    
        ClientFormsAuthenticationMembershipProvider authProvider =
            (ClientFormsAuthenticationMembershipProvider)
            System.Web.Security.Membership.Provider;
    
        try
        {
            authProvider.Logout();
        }
        catch (WebException ex)
        {
            MessageBox.Show("Unable to access the authentication service." +
                Environment.NewLine + "Logging off locally only.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            ConnectivityStatus.IsOffline = true;
            authProvider.Logout();
            ConnectivityStatus.IsOffline = false;
        }
    
        Application.Restart();
    }
    

Para testar a funcionalidade logout, execute o aplicativo e selecione Remember me na caixa de diálogo Login. Em seguida, feche e reinicie o aplicativo para confirmar que você não tem mais efetuar login. Finalmente, reinicie o aplicativo clicando em Log out.

Ativando o modo off-line

No procedimento a seguir, você adicionar um caixa de seleção ao formulário para permitir que o usuário entre no modo off-line. Seu aplicativo indica o modo off-line, definindo a propriedade static ConnectivityStatus.IsOffline como true. O status off-line está armazenado em disco rígido o local no local indicado pela propriedade Application.UserAppDataPath. Isso significa que o status off-line é armazenado em um por usuário, por aplicativo base.

No modo off-line, todas as solicitações serviço de aplicativos cliente recuperam dados do cache local em vez de tentar acessar os serviços. Na configuração padrão, os dados locais inclui um formato criptografado da senha do usuário. Isso permite o usuário efetuar logon enquanto o aplicativo estiver no modo off-line. Para obter mais informações, consulte Como: Configura os serviços de aplicativo do cliente.

Para ativar o modo off-line em seu aplicativo

  1. Em Solution Explorer,no ClientAppServicesDemo projeto, selecione Form1 e, em seguida, selecione View | Designer no menu principal Visual Studio.

  2. No designer, adicione um controle CheckBox ao formulário.

  3. No Propriedades janela, especifique um (nome) valor de workOfflineCheckBox e um texto valor & trabalhar offline.

  4. Na janela Properties, clique no botão Properties.

  5. Selecione o evento CheckedChanged e pressione ENTER para gerar um manipulador de eventos.

  6. Substitua o código gerado pelo seguinte código.

    Esse código atualiza o valor IsOffline e silenciosamente revalidada o usuário quando eles retornarem ao modo online. O ClientFormsIdentity.RevalidateUser método usa as credenciais em cache para que o usuário não precise explicitamente log in. Se o serviço de autenticação não estiver disponível, será exibida uma mensagem de aviso e o aplicativo permanece offline.

    ObservaçãoObservação

    O método RevalidateUser é apenas para conveniência. Porque ele não tem um valor de retorno, isso não é possível indicar se a revalidação falhou. A Revalidação pode falhar, por exemplo, se as credenciais do usuário forem alteradas no servidor. Nesse caso, talvez queira incluir o código que valida usuários explicitamente após uma chamada de serviço falha. Para obter mais informações, consulte a seção acessar configurações da Web anteriormente nessa explicação passo a passo.

    Após revalidação, esse código salva as alterações às configurações locais da Web chamando o método SaveSettings que você adicionou anteriormente. Em seguida, recupera os novos valores no servidor chamando o método Reload do projeto do Settings Classe (acessada como Properties.Settings.Default em C# e My.Settings no Visual Basic).

    Private Sub workOfflineCheckBox_CheckedChanged( _
        ByVal sender As Object, ByVal e As EventArgs) _
        Handles workOfflineCheckBox.CheckedChanged
    
        ConnectivityStatus.IsOffline = workOfflineCheckBox.Checked
    
        If Not ConnectivityStatus.IsOffline Then
    
            Try
    
                ' Silently re-validate the user.
                CType(System.Threading.Thread.CurrentPrincipal.Identity,  _
                    ClientFormsIdentity).RevalidateUser()
    
                ' If any settings have been changed locally, save the new
                ' new values to the Web settings service.
                SaveSettings()
    
                ' If any settings have not been changed locally, check 
                ' the Web settings service for updates. 
                My.Settings.Reload()
    
            Catch ex As WebException
    
                MessageBox.Show( _
                    "Unable to access the authentication service. " & _
                    Environment.NewLine + "Staying in offline mode.", _
                    "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                workOfflineCheckBox.Checked = True
    
            End Try
    
        End If
    
    End Sub
    
    private void workOfflineCheckBox_CheckedChanged(
        object sender, EventArgs e)
    {
        ConnectivityStatus.IsOffline = workOfflineCheckBox.Checked;
        if (!ConnectivityStatus.IsOffline)
        {
            try
            {
                // Silently re-validate the user.
                ((ClientFormsIdentity)
                    System.Threading.Thread.CurrentPrincipal.Identity)
                    .RevalidateUser();
    
                // If any settings have been changed locally, save the new
                // new values to the Web settings service.
                SaveSettings();
    
                // If any settings have not been changed locally, check 
                // the Web settings service for updates. 
                Properties.Settings.Default.Reload();
            }
            catch (WebException)
            {
                MessageBox.Show(
                    "Unable to access the authentication service. " +
                    Environment.NewLine + "Staying in offline mode.",
                    "Warning", MessageBoxButtons.OK,
                    MessageBoxIcon.Warning);
                workOfflineCheckBox.Checked = true;
            }
        }
    }
    
  7. Adicione o seguinte código ao final do método Form1_Load para certificar-se que a caixa de seleção exibe o estado da conexão atual.

    workOfflineCheckBox.Checked = ConnectivityStatus.IsOffline
    
    workOfflineCheckBox.Checked = ConnectivityStatus.IsOffline;
    

Isso conclui o aplicativo exemplo. Para testar o recurso off-line, execute o aplicativo, faça logon como funcionário ou gerente e em seguida, selecione Work offline. Modifique o valor na caixa de texto e, em seguida, feche o aplicativo. Reinicie o aplicativo. Para parar o servidor manualmente, clique com o botão direito do mouse no ícone do Servidor de Desenvolvimento do ASP.NET na área de notificação da barra de tarefas e, em seguida, clique em Stop. Em seguida, logon normalmente. Mesmo quando o servidor não está sendo executado, você ainda pode efetuar login. Modificar o valor da caixa de texto, sair e reiniciar para ver o valor modificado.

Resumo

Nessa explicação passo a passo, você aprendeu como habilitar e usar serviços aplicativo cliente em um aplicativo Formulários do Windows. Após configurar um servidor de teste, você adicionou o código ao seu aplicativo para autenticar usuários e recuperar funções de usuário e configurações do aplicativo a partir do servidor. Você também aprendeu ativar o modo off-line para que o aplicativo use um cache de dados local em vez dos serviços remotos quando a conectividade não está disponível.

Próximas etapas

Em um aplicativo do mundo real, você acessará os dados para vários usuários de um servidor remoto que nem sempre pode estar disponível, ou pode ir para baixo sem aviso. Para fazer seu aplicativo robusto, você deve responder adequadamente a situações onde o serviço não está disponível. Essa explicação passo a passo Inclui blocos try/catch para capturar um WebException e exibir um mensagem de erro quando o serviço não está disponível. No código de produção, talvez queira manipular esta ocorrência por alternar para o modo off-line, sair do aplicativo ou negar acesso a funcionalidade específica.

Para aumentar a segurança do seu aplicativo, certifique-se de testar completamente a aplicativo e servidor antes da implantação.

Consulte também

Tarefas

Como: Configura os serviços de aplicativo do cliente

Passo a passo: Usando Serviços de Aplicativos do ASP.NET

Conceitos

Visão geral dos serviços de aplicativos do cliente

Outros recursos

Serviços de Aplicativo Cliente

Ferramenta de Admnistração de Web Site ASP.NET

Criando e configurando o banco de dados dos Serviços de Aplicativos para o SQL Server