Olá pessoal,
Separei alguns links com materiais de estudo sobre o SQL Server 2008, com informação tanto para desenvolvimento quanto para infra-estrutura.
- SQL Server 2008 JumpStart (necessário registro)
- Possui demos, labs, apresentações, vídeos e VPC para download sobre:
- Novidades do T-SQL
- Uso de dados não relacionais (Spatial Data, FileStream, XML, Fulltext Search)
- Service Broker
- SQLCLR
- Entity Framework
- Compatibilidade de aplicações
- Alta disponibilidade
- Replicação de dados
- Transparent Data Encryption
- Escalabilidade
- Gerenciamento
- SQL Server 2008 Developer Training Kit
- Informações de desenvolvimento sobre:
- FileStream
- Spatial Data
- Novidades do T-SQL
- Tipo Date e tipo Time
- SQLCLR
- Reporting Services
- SQL 2008 Virtual Labs
-
Treinamentos gratuitos
-
E-book gratuito
Se alguém tiver alguma outra dica de material de estudo para SQL 2008, favor deixar nos comentários.
Olá pessoal,
Esta é a última parte da série de autenticação customizada com WCF e hoje iremos ver como o cliente fornece as informações das credenciais para o serviço.
O primeiro passo é começar com uma aplicação que contém um proxy gerado para o serviço, em seguida configurá-la para utilizar autenticação do tipo UserName e também para validar o serviço através de um certificado, conforme abaixo:
1: <configuration>
2: <system.serviceModel>
3: <bindings>
4: <wsHttpBinding>
5: <binding ...>
6: <security mode="Message">
7: <message clientCredentialType="UserName"/>
8: </security>
9: </binding>
10: </wsHttpBinding>
11: </bindings>
12: ...
13: <behaviors>
14: <endpointBehaviors>
15: <behavior name="ClientCertificateBehaviour">
16: <clientCredentials>
17: <serviceCertificate>
18: <authentication
19: certificateValidationMode="PeerOrChainTrust"/>
20: </serviceCertificate>
21: </clientCredentials>
22: </behavior>
23: </endpointBehaviors>
24: </behaviors>
25: </system.serviceModel>
26: </configuration>
Em seguida, é necessário que a aplicação informe ao serviço a credencial utilizada na autenticação:
1: CalculatorServiceReference.CalculatorClient proxy = new CalculatorServiceReference.CalculatorClient();
2:
3: proxy.ClientCredentials.UserName.UserName = "administrator";
4: proxy.ClientCredentials.UserName.Password = "P@ssw0rd";
5:
6: double n = proxy.Add(1, 2);
O download do código fonte gerado na série pode ser realizado aqui
Posts da série:
Olá pessoal,
No post anterior da nossa série, Autenticação customizada de WCF – Parte I, mostrei como criar uma classe para autenticar as informações de usuário e senha, ficando pendente como trafegar estas informações de maneira segura, através do uso de certificados. Exatamente o assunto do post de hoje.
O primeiro passo é conseguir o certificado para ser utilizado na configuração do serviço. Uma opção para ambientes de produção é comprar um certificado de uma entidade certificadora, uma outra opção é gerar um certificado através do Certificate Server, uma das funcionalidade do Windows Server. Já para ambientes de desenvolvimento uma abordagem interessante pode ser gerar certificados de teste (acho que ficou claro) utilizando a ferramenta makecert.
Com o makecert é necessário primeiro criar um certificado Root, utilizado na geração de outros certificados. Para isto, o comando abaixo deve ser executado no prompt de comando:
makecert -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.cer
Depois de gerar o certificado Root, precisamos instalá-lo no computador. O que deve ser feito no Snap-in de certificados para o computador local do MMC na pasta Trusted Root Certification Authorities, conforme imagem abaixo:
Com o certificado Root instalado, podemos utilizá-lo para gerar o certificado que irá efetivamente proteger a comunicação entre o cliente e o serviço. Para isto, o comando abaixo deve ser executado no prompt de comando:
makecert -sk localhost -iv RootCATest.pvk -n "CN=localhost" -ic RootCATest.cer -sr localmachine -ss trustedPeople -sky exchange -pe
Notem que o comando acima cria e instala o certificado na pasta Trusted People, sem necessidade de instalação manual.
Agora que os certificados foram criados e instalados, precisamos configurar o serviço e o cliente para utilizá-los. O serviço deve ser configurado utilizando a tag serviceCertificate, conforme exemplo abaixo:
1: <behaviors>
2: <serviceBehaviors>
3: <behavior name="WCFService.CalculatorServiceBehavior">
4: <serviceMetadata httpGetEnabled="True"/>
5: <serviceDebug includeExceptionDetailInFaults="False" />
6: <serviceCredentials>
7: <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFCustomAuthentication.CustomUsernamePasswordValidator, WCFCustomAuthentication"/>
8: <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="TrustedPeople"/>
9: </serviceCredentials>
10: </behavior>
11: </serviceBehaviors>
12: </behaviors>
Já a configuração do cliente deve ficar similar ao código xml abaixo:
1: <behaviors>
2: <endpointBehaviors>
3: <behavior name="ClientCertificateBehaviour">
4: <clientCredentials>
5: <serviceCertificate>
6: <authentication certificateValidationMode="PeerOrChainTrust"/>
7: </serviceCertificate>
8: </clientCredentials>
9: </behavior>
10: </endpointBehaviors>
11: </behaviors>
Notem que o cliente foi configurado para validar o serviço como PeerOrChainTrust, o que significa que primeiro ele vai verificar se confia no próprio certificado e se não conseguir tenta validar a cadeia hierárquica até chegar no certificado Root. O modelo mais seguro é a validação através da hierarquia (ChainTrust), entretanto isto não é possível com certificados criados utilizando a ferramenta makecert, somente com certificados comerciais.
Posts da série:
Olá pessoal,
Estava conversando com um cliente sobre como um serviço WCF pode autenticar de maneira customizada as chamadas que recebe, confrontando as informações de usuário e senha com os dados de uma tabela em um banco de dados.
O primeiro para é criar uma classe para autenticar as chamadas do serviço. Esta classe deve herdar de System.IdentityModel.Selectors.UserNamePasswordValidator, disponível no assembly System.IdentityModel, e implementar o método Validate, conforme abaixo:
1: public class CustomUsernamePasswordValidator : UserNamePasswordValidator
2: {
3: public override void Validate(string userName, string password)
4: {
5: if (userName == null || password == null)
6: {
7: throw new ArgumentNullException();
8: }
9:
10: if (!(userName == "administrator" && password == "P@ssw0rd"))
11: {
12: throw new FaultException("Unknown username or invalid password");
13: }
14: }
15: }
Notem que por uma questão de facilidade não estou utilizando um banco de dados para validar usuário e senha, mas sim comparando as informações recebidas contra constantes no meu código. Se a autenticação não ocorrer com sucesso emito uma mensagem de erro do tipo FaulException, que é o tipo de exceção possível de ser propagada pelo WCF (isso vale um post).
Em seguida é necessário configurar o serviço para utilizar esta customização para autenticação no arquivo de configurações:
1: <services>
2: <service behaviorConfiguration="WCFService.CalculatorServiceBehavior" ...>
3: ...
4: </service>
5: </services>
6: <behaviors>
7: <serviceBehaviors>
8: <behavior name="WCFService.CalculatorServiceBehavior">
9: <serviceMetadata httpGetEnabled="True"/>
10: <serviceDebug includeExceptionDetailInFaults="False" />
11: <serviceCredentials>
12: <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFCustomAuthentication.CustomUsernamePasswordValidator, WCFCustomAuthentication"/>
13: </serviceCredentials>
14: </behavior>
15: </serviceBehaviors>
16: </behaviors>
Agora é necessário configurar tanto o serviço quanto o cliente para autenticar as chamadas através de usuário e senha nos seus bindings:
1: <bindings>
2: <wsHttpBinding>
3: <binding name="wsHttpBindingWithMessageSecurity">
4: <security mode="Message">
5: <message clientCredentialType="UserName"/>
6: </security>
7: </binding>
8: </wsHttpBinding>
9: </bindings>
Como as informações de usuário e senha passam de maneira aberta é necessário configurar a comunicação para ocorrer de maneira segura utilizando um certificado, mas isto é assunto para o post Autenticação customizada de WCF – Parte II.
Por último também é necessário que o cliente do serviço informe as credenciais na chamadas das operações, assunto do post Autenticação customizada de WCF – Parte III.
Posts da série:
Olá pessoal,
Nos dias 24 e 25 de setembro de 2009 teremos na Microsoft/SP dois Hands On Labs de ALM para parceiros Microsoft. Se você trabalha em um parceiro pode se inscrever.
No total teremos 24 laboratórios com foco em: desenvolvimento em times, controle de versões, análise de código, testes e builds.
As inscrições podem ser feitas aqui (mesmo HOL em dois dias diferentes):
Local: Microsoft Brasil
Av. Nações Unidas, 12.901, Torre Norte 31º andar
04578-000 São Paulo, SP
Lembre-se de me avisar se você se inscrever.
Abraços,
Rafael
Olá pessoal,
Nesta semana estamos tendo na Microsoft Brasil alguns HOLs (Hands On Labs) de .NET Framework 3.x (3.0, 3.5 e 3.5 SP1) para parceiros e uma dúvida que o pessoal teve foi como replicar o conteúdo nas empresas e também como preparar uma máquina virtual igual a utilizada na sala de aula.
Separei aqui algumas referências que utilizei para preparar o ambiente:
Abraços e até a próxima.
Olá pessoal,
Gravei meu primeiro vídeo para o Channel9, é um vídeo com uma introdução ao WF 4.0.
Lembrem-se de comentar o que acharam.
Olá pessoal,
Semana passada ocorreu o TechEd, principal evento técnico da Microsoft no Brasil, onde foram apresentadas grandes novidades em várias palestras, como: Windows 7, Windows Server 2008 R2, Visual Studio 2010 e .NET Framework 4.0 e Windows Azure.
Fiz três palestras, todas com sala cheia, abaixo separei as demos para download:
As apresentações serão disponibilizadas para download no site do evento.
Se você esteve presente em alguma das minhas palestras e quer discutir algum tópico, faça seu comentário :)
Olá pessoal,
Estou preparando meu ambiente para as demos no TechEd Brasil 2009 e resolvi testar uma funcionalidade de conseguir dar boot de arquivos vhd do Windows 7. Abaixo você encontra algumas dicas e a maneira que utilizei para fazer a instalação, existem outras.
Dicas
-
A versão do Windows 7 que precisa ser instalada no arquivo vhd é a Ultimate ou Enterprise, outras versão não são suportadas;
-
O arquivo vhd precisa estar em um file system NTFS;
-
O arquivo vhd não pode estar compactado com NTFS;
-
O arquivo vhd precisa estar em um disco interno do computador, não é possível dar boot de vhd armazenado em disco USB;
-
O disco do computador precisa ter de espaço livre pelo menos o tamanho total do VHD, mesmo para um VHD dinâmico.
Como vocês devem imaginar, cometi todos os erros acima na minha instalação :)
Criação do arquivo VHD
O primeiro passo é criar um disco VHD, que pode ser realizado através da linha de comando DISKPART:
DISKPART
CREATE VDISK FILE=C:\VHD\<filename>.vhd MAXIMUM=20000 TYPE=EXPANDABLE
SELECT VDISK FILE=C:\VHD\<filename>.vhd
ATTACH VDISK
CREATE PARTITION PRIMARY
ASSIGN LETTER=V
FORMAT QUICK FS=NTFS LABEL=VHD
EXIT
Instalação
Depois do arquivo criado VHD, é necessário instalar o Windows 7. Existem algumas maneiras de realizar a instalação, eu preferi o script powershell Install-WindowsImagem, que pode ser utilizado para instalar um arquivo de imagem Windows (.wim), disponível no disco de instalação do Windows 7 em um arquivo VHD.
O arquivo wim está localizado no diretório \sources\install.wim da instalação do Windows 7.
Parar este script é necessário modificar a permissão de execução de scripts, conforme comando abaixo:
PS > set-ExecutionPolicy RemoteSigned
Em seguida devemos descobrir qual versão de Windows instalar, o comando abaixo lista as versões disponíveis:
PS> .\Install-WindowsImage.ps1 -WIM D:\sources\install.wim
Já a instalação leva em torno de 15 minutos e pode ser feita com o comando:
PS> .\Install-WindowsImage.ps1 -WIM D:\sources\install.wim -Apply -Index 5 -Destination V:
Configuração do boot
Após a instalação é necessário configurar o Windows 7 para o boot, imaginando que o disco que foi feita a instalação está montado no drive V, o processo seria feito com o comando:
V:\Windows\System32\bcdboot V:\Windows
Ao realizar um boot será exibido um menu para escolha de qual instalação subir, é só escolher a opção para o boot do VHD e terminar o processo de instalação.
Maiores detalhes podem ser encontrados no documento Using Install-WindowsImage to apply a Windows Image to a VHD.
Olá pessoal, tudo bom?
Hoje separei alguns links de estudo de .NET Framework 3.x para passar para vocês. Como sabemos, as versões mais atuais do .NET Framework nada mais são do que conjunto de classes e funcionalidades que foram incorporadas ao .NET Framework em uma estrutura de pilha e funcionam em cima da Common Language Runtime do .NET Framework 2.0, conforme ilustração abaixo.

Na ordem cronológica temos:
.NET Framework 3.0: Lançado em 2006, apresenta como novidades:
-
Windows Communication Foundation (WCF): Permite o desenvolvimento de aplicações distribuídas através de uma plataforma unificada de comunicação, permitindo que os desenvolvedores criem serviços através de diferentes protocolos sem precisar conhecer os detalhes de cada um.
-
Windows Presentation Foundation (WPF): Introduziu uma maneira fácil de criar aplicações com uma rica interface visual através de linguagem de marcação XAML, com suporte à aceleração por hardware, transparências, gradientes, animações e transformações.
-
Windows Workflow Foundation (WF): Fornece uma modelo de programação para workflows, com possibilidade suporte à transações de longa duração e persistência de informações gerenciadas pelo próprio runtime.
-
CardSpace: Mecanismo de gerenciamento de tokens de identidade para aplicações cliente.
Uma excelente maneira de estudar os conceitos do .NET Framework 3.0 é através do seu Training Kit, que coloquei para download no meu SkyDrive.
.NET Framework 3.5: Esta versão foi lançada em 2007 e trouxe uma séria de novas funcionalidades, dentre as quais considero as principais:
-
LINQ(Language Integrated Query): Define uma padronização para criação de queries na própria linguagem de programação, com suporte à consulta em objetos, XML e bases de dados SQL Server.
-
C# 3.0 e VB.NET 9.0: Novidades nas linguagens de programação, como: suporte à LINQ, object/collection initializers, anonymous types, automatic properties e extension methods (optei por manter os termos em inglês).
-
Melhorias no WCF: Exposição de WFs como serviços, suporte nativo à REST, POX e JSON.
-
ASP.NET AJAX: Nesta versão o AJAX veio integrado ao .NET Framework e Visual Studio, sem a necessidade de uma instalação separada.
Para estudar recomendo baixar o Visual Studio 2008 and .NET Framework 3.5 Training Kit, onde você vai encontrar uma série de Hands On Labs sobre os assuntos acima, entre outras novidades.
.NET Framework 3.5 SP1: O Service Pack 1 do .NET Framework 3.5, lançado em 2008, não se preocupou somente na correção de erros e melhoria de desempenho, ele trouxe uma série de novidades para os desenvolvedores, as principais são:
-
ADO.NET Entity Framework: É a primeira versão de um ORM (Object Relational Mapping) para o .NET Framework, permitindo o mapeamento de informações em banco de dados para objetos na memória e também o contrário.
-
ADO.NET Data Services: Mecanismos de exposição de dados através de um serviços com uma interface REST.
-
ASP.NET Routing: Funcionalidade de interpretação e roteamento das requisições ASP.NET, utilizado internamento pelo ASP.NET Dynamica Data e ASP.NET MVC.
-
ASP.NET Dynamic Data: Possibilita a criação de páginas para manipulação de dados no estilo CRUD.
O material de estudo recomendado é o .NET Framework 3.5 Enhancements Training Kit, onde você encontra as novidades listadas acima além de outras novidades do .NET Framework 3.5 SP1.
Espero que os Training Kits que separei para vocês possam ajudar no estudo e no uso das APIs do .NET Framework 3.x.
Até a próxima e não esqueçam de comentar.
Olá pessoal, tudo bom?
No último sábado (18/07/2009) participei do 12o encontro do grupo DotNetArchitects e fiz uma apresentação sobre aplicações distribuídas com WCF, onde comentei sobre: motivação para uso de serviços, visão geral do WCF e cenários de uso do WCF. No final foi muito bacana, fizemos uma discussão sobre o assunto que acabou se estendendo até o uso de Oslo.
Cheguei a fazer também algumas demos sobre a criação de serviços, hospedagem de serviços em uma aplicação .NET, no IIS e também no WAS. No final também falei um pouco sobre serviços REST com WCF.
Se alguém tiver interesse, coloquei a apresentação para download no SkyDrive.
[]'s
Rafael
Olá pessoal,
Dando continuidade à nossa série de WCF, segue screencast mostrando como consumir serviços WCF através de uma aplicação cliente.
Para assistir offline, o download pode ser realizado aqui.
Olá pessoal, dando continuidade às postagens sobre WCF, agora vou comentar sobre como consumir serviços utilizando WCF.
O primeiro passo é adicionar um novo projeto na solução, aqui vou adicionar um projeto do tipo WPF Application e a solução deve ficar assim:
Em seguida é necessário criar uma interface para o cliente do serviço, para isto basta utilizar o XAML abaixo.
1: <Window x:Class="ClienteWCF.Window1"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: Title="ClienteWCF" Height="300" Width="300">
5: <Grid>
6: <Grid.ColumnDefinitions>
7: <ColumnDefinition/>
8: <ColumnDefinition/>
9: </Grid.ColumnDefinitions>
10: <Grid.RowDefinitions>
11: <RowDefinition Height="40*" />
12: <RowDefinition Height="40*" />
13: <RowDefinition Height="40*" />
14: <RowDefinition Height="200*" />
15: </Grid.RowDefinitions>
16: <TextBlock Text="Valor1:" Grid.Column="0"
17: Grid.Row="0" Margin="5" />
18: <TextBlock Text="Valor2:" Grid.Column="0"
19: Grid.Row="1" Margin="5" />
20: <TextBlock Text="Resultado:" Grid.Column="0"
21: Grid.Row="2" Margin="5" />
22: <TextBox x:Name="Valor1TextBox" Grid.Column="1"
23: Grid.Row="0" Margin="5" />
24: <TextBox x:Name="Valor2TextBox" Grid.Column="1"
25: Grid.Row="1" Margin="5" />
26: <TextBlock x:Name="ResultadoTextBlock" Grid.Column="1"
27: Grid.Row="2" Margin="5" />
28: <Button x:Name="SomarButton" Grid.Row="3" Grid.ColumnSpan="2"
29: Click="SomarButton_Click" Content="Somar" Width="100"
30: Height="40" VerticalAlignment="Top" Margin="5"/>
31: </Grid>
32: </Window>
Que deve gerar a seguinte tela:

Depois é necessário adicionar uma referência para o serviço WCF, conforme na tela abaixo
Em seguida clique no botão Discover para pesquisar pelos projetos de serviço na solução, escolha o serviço da calculadora e forneça um nome para o namespace, no exemplo o nome é CalcServiceReference.
Com a referência criada o próximo passo é criar o código para chamar o serviço, conforme o seguinte exemplo.
1: private void SomarButton_Click(object sender, RoutedEventArgs e)
2: { 3: var servico = new CalcServiceReference.CalcServiceClient();
4: var valor1 = double.Parse(Valor1TextBox.Text);
5: var valor2 = double.Parse(Valor2TextBox.Text);
6: var resultado = servico.Add(valor1, valor2);
7: ResultadoTextBlock.Text = resultado.ToString();
8: }
Depois é só compilar e testar a aplicação, segue o print do meu teste.
O código fonte deste post pode ser acessado aqui.
Olá pessoal,
Amanhã vou fazer um webcast, em conjunto com o Alex Schulz, sobre as novidades do Windows 7 para os desenvolvedores. Estão todos convidados para participar!
A inscrição no webcast pode ser feita aqui.
Até a próxima.
Rafael Godinho
Vou fazer em conjunto com o Luciano Condé, no dia 20/05/2009 às 17:30 horário de brasília, um webcast sobre boas práticas com WCF.
Vamos tratar assuntos desde requisitos na definição dos serviços, até qual as melhores opções de desenvolvimento e configuração de acordo com cenários de uso.
Se você quiser se inscrever é só clicar aqui.