Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os aplicativos da Plataforma Universal do Windows (UWP) que exigem autenticação segura além de uma combinação de ID de usuário e senha podem usar certificados para autenticação. A autenticação de certificado fornece um alto nível de confiança ao autenticar um usuário. Em alguns casos, um grupo de serviços desejará autenticar um usuário para vários aplicativos. Este artigo mostra como você pode autenticar vários aplicativos usando o mesmo certificado e como você pode fornecer código conveniente para um usuário importar um certificado que foi fornecido para acessar serviços Web seguros.
Os aplicativos podem se autenticar em um serviço Web usando um certificado, e vários aplicativos podem usar um único certificado do repositório de certificados para autenticar o mesmo usuário. Se não existir um certificado na loja, você poderá adicionar código ao seu aplicativo para importar um certificado de um arquivo PFX.
Habilitar o Microsoft Internet Information Services (IIS) e o mapeamento de certificados de cliente
Este artigo usa o Microsoft Internet Information Services (IIS) para fins de exemplo. O IIS não está habilitado por padrão. Você pode habilitar o IIS usando o Painel de Controle.
- Abra o Painel de Controle e selecione Programas.
- Selecione Ativar ou desativar recursos do Windows.
- Expanda Serviços de Informações da Internet e, em seguida, expanda Serviços da World Wide Web . Expanda Recursos de Desenvolvimento de Aplicativos e selecione ASP.NET 3.5 e ASP.NET 4.5. Fazer essas seleções habilitará automaticamente Serviços de Informações da Internet.
- Clique OK para aplicar as alterações.
Criar e publicar um serviço Web seguro
Execute o Microsoft Visual Studio como administrador e selecione Novo Projeto na página inicial. O acesso de administrador é necessário para publicar um serviço Web em um servidor IIS. Na caixa de diálogo Novo projeto, altere a estrutura para .NET Framework 3.5. Selecione Visual C# ->Web ->Visual Studio ->ASP.NET Web Service Application. Nomeie o aplicativo "FirstContosoBank". Clique OK para criar o projeto.
No arquivo Service1.asmx.cs, substitua o método padrão HelloWorld web pelo seguinte método "Login".
[WebMethod] public string Login() { // Verify certificate with CA var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2( this.Context.Request.ClientCertificate.Certificate); bool test = cert.Verify(); return test.ToString(); }Salve o arquivo Service1.asmx.cs.
No Explorador de Soluções, clique com o botão direito do mouse no app "FirstContosoBank" e selecione Publicar.
Na janela de diálogo Publicar Web, crie um novo perfil e dê-lhe o nome de "ContosoProfile". Clique em Avançar.
Na página seguinte, insira o nome do servidor IIS e especifique um nome de site como "Site Padrão/FirstContosoBank". Clique Publicar para publicar o seu serviço web.
Configurar seu serviço Web para usar a autenticação de certificado de cliente
- Execute o Gerenciador dos Serviços de Informações da Internet (IIS).
- Expanda os sites para o servidor IIS. No Site Padrão, selecione o novo serviço Web "FirstContosoBank". Na seção Ações, selecione Configurações avançadas....
- Defina o Pool de Aplicativos para .NET v2.0 e clique em OK.
- No Gestor dos Serviços de Informações da Internet (IIS), selecione o seu servidor IIS e, em seguida, clique duas vezes em Certificados do Servidor. Na seção Ações, selecione Criar Self-Signed Certificado.... Digite "ContosoBank" como o nome amigável para o certificado e clique em OK. Isso criará um novo certificado para uso pelo servidor IIS na forma de "<nome do servidor>.<nome de domínio>".
- No Gestor de Serviços de Informações da Internet (IIS), selecione o site padrão. Na seção Ações , selecione Vinculação e clique em Adicionar... . Selecione "https" como o tipo, defina a porta para "443" e insira o nome completo do host para o seu servidor IIS ("<nome-do-servidor>.<nome-do-domínio>"). Defina o certificado SSL como "ContosoBank". Clique em OK. Clique Fechar na janela Ligações de Site.
- No Gerenciador dos Serviços de Informações da Internet (IIS), selecione o serviço Web "FirstContosoBank". Clique duas vezes em Configurações SSL. Selecione Exigir SSL. Em Certificados de cliente, selecione Exigir. Na seção Ações , clique em Aplicar.
- Você pode verificar se o serviço Web está configurado corretamente abrindo o navegador da Web e digitando o seguinte endereço da Web: "https://<nome do servidor>.<nome de domínio>/FirstContosoBank/Service1.asmx". Por exemplo, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Se o serviço Web estiver configurado corretamente, você será solicitado a selecionar um certificado de cliente para acessar o serviço Web.
Você pode repetir as etapas anteriores para criar vários serviços Web que podem ser acessados usando o mesmo certificado de cliente.
Criar um aplicativo UWP que usa autenticação de certificado
Agora que você tem um ou mais serviços Web seguros, seus aplicativos podem usar certificados para autenticar nesses serviços Web. Quando você faz uma solicitação para um serviço Web autenticado usando o objeto HttpClient, a solicitação inicial não conterá um certificado de cliente. O serviço Web autenticado responderá com uma solicitação de autenticação de cliente. Quando isso ocorre, o cliente Windows consultará automaticamente o armazenamento de certificados para obter certificados de cliente disponíveis. Seu usuário pode selecionar entre esses certificados para autenticar no serviço Web. Alguns certificados são protegidos por senha, portanto, você precisará fornecer ao usuário uma maneira de inserir a senha para um certificado.
Se não houver certificados de cliente disponíveis, o usuário precisará adicionar um certificado ao armazenamento de certificados. Você pode incluir código em seu aplicativo que permite que um usuário selecione um arquivo PFX que contenha um certificado de cliente e, em seguida, importe esse certificado para o armazenamento de certificados do cliente.
Dica Você pode usar makecert.exe para criar um arquivo PFX para usar com este início rápido. Para obter informações sobre como usar makecert.exe, consulte MakeCert.
Abra o Visual Studio e crie um novo projeto na página inicial. Nomeie o novo projeto como "FirstContosoBankApp". Clique OK para criar o novo projeto.
No arquivo MainPage.xaml, adicione o seguinte XAML ao elemento padrão Grid. Esse XAML inclui um botão para procurar um arquivo PFX para importar, uma caixa de texto para inserir uma senha para um arquivo PFX protegido por senha, um botão para importar um arquivo PFX selecionado, um botão para fazer login no serviço Web seguro e um bloco de texto para exibir o status da ação atual.
<Button x:Name="Import" Content="Import Certificate (PFX file)" HorizontalAlignment="Left" Margin="352,305,0,0" VerticalAlignment="Top" Height="77" Width="260" Click="Import_Click" FontSize="16"/> <Button x:Name="Login" Content="Login" HorizontalAlignment="Left" Margin="611,305,0,0" VerticalAlignment="Top" Height="75" Width="240" Click="Login_Click" FontSize="16"/> <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="355,398,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="153" Width="560"/> <PasswordBox x:Name="PfxPassword" HorizontalAlignment="Left" Margin="483,271,0,0" VerticalAlignment="Top" Width="229"/> <TextBlock HorizontalAlignment="Left" Margin="355,271,0,0" TextWrapping="Wrap" Text="PFX password" VerticalAlignment="Top" FontSize="18" Height="32" Width="123"/> <Button x:Name="Browse" Content="Browse for PFX file" HorizontalAlignment="Left" Margin="352,189,0,0" VerticalAlignment="Top" Click="Browse_Click" Width="499" Height="68" FontSize="16"/> <TextBlock HorizontalAlignment="Left" Margin="717,271,0,0" TextWrapping="Wrap" Text="(Optional)" VerticalAlignment="Top" Height="32" Width="83" FontSize="16"/>Salve o arquivo MainPage.xaml.
No arquivo MainPage.xaml.cs, adicione as declarações 'using' a seguir.
using Windows.Web.Http; using System.Text; using Windows.Security.Cryptography.Certificates; using Windows.Storage.Pickers; using Windows.Storage; using Windows.Storage.Streams;No arquivo MainPage.xaml.cs, adicione as seguintes variáveis à classe MainPage. Eles especificam o endereço para o método seguro de "Login" do seu serviço web "FirstContosoBank" e uma variável global que contém um certificado PFX a importar para o store de certificados. Atualize o nome do servidor <> para o nome do servidor totalmente qualificado do seu servidor Microsoft Internet Information Server (IIS).
private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login"); private string pfxCert = null;No arquivo MainPage.xaml.cs, adicione o seguinte manipulador de clique para o botão de login e o método para acessar o serviço Web seguro.
private void Login_Click(object sender, RoutedEventArgs e) { MakeHttpsCall(); } private async void MakeHttpsCall() { StringBuilder result = new StringBuilder("Login "); HttpResponseMessage response; try { Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient(); response = await httpClient.GetAsync(requestUri); if (response.StatusCode == HttpStatusCode.Ok) { result.Append("successful"); } else { result = result.Append("failed with "); result = result.Append(response.StatusCode); } } catch (Exception ex) { result = result.Append("failed with "); result = result.Append(ex.Message); } Result.Text = result.ToString(); }No arquivo MainPage.xaml.cs, adicione os seguintes manipuladores de clique para o botão para procurar um arquivo PFX e o botão para importar um arquivo PFX selecionado para o armazenamento de certificados.
private async void Import_Click(object sender, RoutedEventArgs e) { try { Result.Text = "Importing selected certificate into user certificate store...."; await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync( pfxCert, PfxPassword.Password, ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, "Import Pfx"); Result.Text = "Certificate import succeeded"; } catch (Exception ex) { Result.Text = "Certificate import failed with " + ex.Message; } } private async void Browse_Click(object sender, RoutedEventArgs e) { StringBuilder result = new StringBuilder("Pfx file selection "); FileOpenPicker pfxFilePicker = new FileOpenPicker(); pfxFilePicker.FileTypeFilter.Add(".pfx"); pfxFilePicker.CommitButtonText = "Open"; try { StorageFile pfxFile = await pfxFilePicker.PickSingleFileAsync(); if (pfxFile != null) { IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile); using (DataReader dataReader = DataReader.FromBuffer(buffer)) { byte[] bytes = new byte[buffer.Length]; dataReader.ReadBytes(bytes); pfxCert = System.Convert.ToBase64String(bytes); PfxPassword.Password = string.Empty; result.Append("succeeded"); } } else { result.Append("failed"); } } catch (Exception ex) { result.Append("failed with "); result.Append(ex.Message); ; } Result.Text = result.ToString(); }Execute seu aplicativo e faça login em seu serviço Web seguro, bem como importe um arquivo PFX para o armazenamento de certificados local.
Você pode usar essas etapas para criar vários aplicativos que usam o mesmo certificado de usuário para acessar os mesmos ou diferentes serviços Web protegidos.