Como enviar uma mensagem autenticada ao Serviço de Notificação por Push do Windows Phone

Artigo original publicado em 05 de junho de 2012, terça-feira

O Serviço de Notificação por Push é um recurso bacana do Windows Phone que permite, por exemplo, enviar mensagens de notificação do sistema ou atualizar um Bloco Dinâmico para o aplicativo Windows Phone. Você poderá usar o serviço sem nenhum outro protocolo de segurança de transmissão, mas se houver um, você terá um limite máximo de 500 mensagens por dia. Usando SSL para configurar uma sessão mutuamente autenticada no Serviço de Notificação por Push, você poderá enviar um número ilimitado de mensagens. Assim, o ato de proteger sua conversa se torna muito mais atraente. O problema é que o procedimento para isso está muito mal documentado. Mas felizmente os fóruns sociais no Windows Phone App Hub são bastante úteis e é possível pinçar e montar cada parte do quebra-cabeça. Para economizar o seu tempo de sair à caça de todas as partes necessárias, tive a ideia de reunir tudo aqui em um único documento. Sabe como é, né? O que a equipe do produto deveria ter feito; :-) E aqui está:

  1. Leia sobre os requisitos do certificado usados para estabelecer essa comunicação segura aqui: https://msdn.microsoft.com/en-us/library/ff941099(v=vs.92). Para simplificar, descobri que um certificado SSL de uma das autoridades de certificado com suporte funcionará bem. Para ver a lista de autoridades de certificado com suporte, acesse: https://msdn.microsoft.com/en-us/library/gg521150(v=vs.92).
  2. Você precisa obter este certificado e carregá-lo no App Hub. O PFX com chave privada não é necessário; basta a versão pública do certificado (quer dizer, o arquivo .cer). Para carregá-lo, acesse o App Hub, faça logon e clique no nome da conta no canto superior esquerdo. Ao acessar a página de gerenciamento de contas, você verá um link chamado Certificados abaixo do banner Minha Conta. Clique nele e siga as instruções para carregar o certificado.
  3. No aplicativo Windows Phone, crie uma instância de classe HttpNotificationChannel. Ao criar o novo HttpNotificationChannel, use o CN (nome comum) do certificado SSL como segundo parâmetro do novo canal. Você pode encontrar o nome comum de seu certificado clicando duas vezes no arquivo .cer para abri-lo; clique na guia Detalhes e clique na propriedade Assunto. Você verá valores exibidos na janela abaixo e o primeiro deverá ser algo como "CN = www.contoso.com"; nesse exemplo, você quer usar só "www.contoso.com". Assim, quando você criasse seu novo canal, ele teria uma aparência como esta: pushChannel = new HttpNotificationChannel("myChannelName", "www.contoso.com");
    1. OBSERVAÇÃO: se você já tiver criado canais para diferentes dispositivos, será necessário encontrar seu canal usando o método HttpNotificationChannel.Find, depois .Close e .Dispose no canal. Depois recrie-o para poder associar seu nome comum à conexão.
  4. Onde é executado o código do lado do servidor, você precisa instalar o certificado, incluindo a chave privada (portanto o arquivo .pfx). Também precisa garantir que a conta referente ao seu pool de aplicativos tenha acesso às chaves privadas desse certificado. Para fazer isso, abra a ferramenta MMC e adicione o snap-in Certificados do Computador Local. Depois de instalar o certificado no nó Pessoal, clique com o botão direito do mouse no certificado no MMC e selecione Todas as Tarefas...Gerenciar Chaves Privadas. Adicione a conta referente a esse pool que o seu aplicativo está usando e lhe conceda pelo menos direitos de Leitura às chaves.
    1. OBSERVAÇÃO: se estiver usando as novas contas internas no IIS 7.5, como ApplicationPoolIdentity, você precisará conceder acesso ao IIS apppool\ASP.NET v4.0, onde “ASP.NET v4.0” é o nome do pool de aplicativos.
  5. No código em que você está enviando a mensagem ao Serviço de Notificação por Push, adicione o certificado ao objeto HttpWebRequest. O procedimento normal para isso é abrir o Repositório do X509, obter a coleção de certificados referente à Minha loja, usar o recurso Localizar na coleção por miniatura, em que é necessário copiar e colar a miniatura do certificado das propriedades do certificado para o seu código e usar o primeiro certificado da coleção que ele retorna (ou seja, myCollection[0]). Com o certificado, é possível adicioná-lo à sua solicitação assim: myRequest..ClientCertificates.Add(mySslCertificate);

Outras questões importantes:

  • Seu certificado carregado é usado só durante quatro meses. Se você não enviar um aplicativo para fins de certificação ao mercado que usa o certificado, será necessário carregá-lo outra vez. Ao enviar o aplicativo para fins de certificação ao mercado, você terá uma oportunidade de selecionar um certificado para ele da lista de certificados que você carregou. Basta selecionar o certificado carregado para essas comunicações e estará tudo pronto.
  • Sabe como verificar se tudo funciona? Ao criar a instância de classe HttpNotificationChannel no cliente do Windows Phone, você obterá de volta um URI de canal de notificação que envia suas mensagens. Observe esse URI; se você não estiver usando uma conexão autenticada, verá "throttledthirdparty" no caminho. Mas se você criou sua instância de classe corretamente, o caminho conterá "unthrottledthirdparty"; além disso, o protocolo exibido será HTTPS em vez de HTTP. É óbvio que, para realmente conferir se tudo funciona, depois de obter esse URI de volta, você precisará enviar uma mensagem com êxito. Se ela chegar perfeitamente ao seu dispositivo, você saberá que funcionou.

Esta é uma postagem de blog traduzida. Consulte o artigo original em How To Send An Authenticated Message to the Windows Phone Push Notification Service