Enviar notificações push seguras a partir dos Hubs de Notificação do Azure

Descrição Geral

O suporte de notificações push no Microsoft Azure permite-lhe aceder a uma infraestrutura push de escalamento horizontal de várias plataformas, de fácil utilização, que simplifica consideravelmente a implementação de notificações push para aplicações empresariais e de consumidor para plataformas móveis.

Devido a restrições regulamentares ou de segurança, por vezes uma aplicação pode querer incluir algo na notificação que não pode ser transmitido através da infraestrutura de notificação push padrão. Este tutorial descreve como alcançar a mesma experiência ao enviar informações confidenciais através de uma ligação segura e autenticada entre o dispositivo cliente e o back-end da aplicação.

A um nível elevado, o fluxo é o seguinte:

  1. O back-end da aplicação:
    • Armazena o payload seguro na base de dados de back-end.
    • Envia o ID desta notificação para o dispositivo (não são enviadas informações seguras).
  2. A aplicação no dispositivo, ao receber a notificação:
    • O dispositivo contacta o back-end a pedir o payload seguro.
    • A aplicação pode mostrar o payload como uma notificação no dispositivo.

É importante ter em atenção que, no fluxo anterior (e neste tutorial), assumimos que o dispositivo armazena um token de autenticação no armazenamento local, após o utilizador iniciar sessão. Isto garante uma experiência totalmente integrada, uma vez que o dispositivo pode obter o payload seguro da notificação com este token. Se a sua aplicação não armazenar tokens de autenticação no dispositivo ou se estes tokens puderem expirar, a aplicação do dispositivo, após receber a notificação, deverá apresentar uma notificação genérica a pedir ao utilizador para iniciar a aplicação. Em seguida, a aplicação autentica o utilizador e mostra o payload de notificação.

Este tutorial mostra como enviar uma notificação push de forma segura. O tutorial baseia-se no tutorial Notificar utilizadores , pelo que deve concluir primeiro os passos nesse tutorial.

Nota

Este tutorial pressupõe que criou e configurou o hub de notificação, conforme descrito em Enviar notificações para Plataforma Universal do Windows aplicações. Além disso, tenha em atenção que o Windows Phone 8.1 necessita de credenciais do Windows (não Windows Phone) e que as tarefas em segundo plano não funcionam no Windows Phone 8.0 ou no Silverlight 8.1. Para aplicações da Loja Windows, só pode receber notificações através de uma tarefa em segundo plano se a aplicação estiver ativada no ecrã de bloqueio (clique na caixa de verificação no Appmanifest).

Projeto WebAPI

  1. No Visual Studio, abra o projeto AppBackend que criou no tutorial Notificar Utilizadores .

  2. Em Notifications.cs, substitua toda a classe Notificações pelo seguinte código. Certifique-se de que substitui os marcadores de posição pela cadeia de ligação (com acesso total) para o hub de notificação e o nome do hub. Pode obter estes valores a partir do portal do Azure. Este módulo representa agora as diferentes notificações seguras que serão enviadas. Numa implementação completa, as notificações serão armazenadas numa base de dados; para simplificar, neste caso, armazenamo-los na memória.

     public class Notification
     {
         public int Id { get; set; }
         public string Payload { get; set; }
         public bool Read { get; set; }
     }
    
     public class Notifications
     {
         public static Notifications Instance = new Notifications();
    
         private List<Notification> notifications = new List<Notification>();
    
         public NotificationHubClient Hub { get; set; }
    
         private Notifications() {
             Hub = NotificationHubClient.CreateClientFromConnectionString("{conn string with full access}",     "{hub name}");
         }
    
         public Notification CreateNotification(string payload)
         {
             var notification = new Notification() {
             Id = notifications.Count,
             Payload = payload,
             Read = false
             };
    
             notifications.Add(notification);
    
             return notification;
         }
    
         public Notification ReadNotification(int id)
         {
             return notifications.ElementAt(id);
         }
     }
    
  3. Em NotificationsController.cs, substitua o código dentro da definição de classe NotificationsController pelo seguinte código. Este componente implementa uma forma de o dispositivo obter a notificação de forma segura e também fornece uma forma (para efeitos deste tutorial) de acionar um push seguro para os seus dispositivos. Tenha em atenção que, ao enviar a notificação para o hub de notificação, apenas enviamos uma notificação não processada com o ID da notificação (e nenhuma mensagem real):

     public NotificationsController()
     {
         Notifications.Instance.CreateNotification("This is a secure notification!");
     }
    
     // GET api/notifications/id
     public Notification Get(int id)
     {
         return Notifications.Instance.ReadNotification(id);
     }
    
     public async Task<HttpResponseMessage> Post()
     {
         var secureNotificationInTheBackend = Notifications.Instance.CreateNotification("Secure confirmation.");
         var usernameTag = "username:" + HttpContext.Current.User.Identity.Name;
    
         // windows
         var rawNotificationToBeSent = new Microsoft.Azure.NotificationHubs.WindowsNotification(secureNotificationInTheBackend.Id.ToString(),
                         new Dictionary<string, string> {
                             {"X-WNS-Type", "wns/raw"}
                         });
         await Notifications.Instance.Hub.SendNotificationAsync(rawNotificationToBeSent, usernameTag);
    
         // apns
         await Notifications.Instance.Hub.SendAppleNativeNotificationAsync("{\"aps\": {\"content-available\": 1}, \"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}", usernameTag);
    
         // gcm
         await Notifications.Instance.Hub.SendGcmNativeNotificationAsync("{\"data\": {\"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}}", usernameTag);
    
         return Request.CreateResponse(HttpStatusCode.OK);
     }
    

Tenha em atenção que o Post método agora não envia uma notificação de alerta. Envia uma notificação não processada que contém apenas o ID de notificação e não qualquer conteúdo confidencial. Além disso, certifique-se de que comenta a operação de envio para as plataformas para as quais não tem credenciais configuradas no hub de notificação, uma vez que resultarão em erros.

  1. Agora, vamos implementar novamente esta aplicação num Site do Azure para torná-la acessível a partir de todos os dispositivos. Clique com o botão direito do rato no projeto AppBackend e selecione Publicar.
  2. Selecione Site do Azure como destino de publicação. Inicie sessão com a sua conta do Azure, selecione um Site existente ou novo e anote a propriedade URL de destino no separador Ligação . Iremos referir-nos a este URL como o ponto final de back-end mais adiante neste tutorial. Clique em Publish (Publicar).

Modificar o projeto de Windows Phone

  1. No projeto NotifyUserWindowsPhone , adicione o seguinte código a App.xaml.cs para registar a tarefa em segundo plano push. Adicione a seguinte linha de código no final do método OnLaunched():

    RegisterBackgroundTask();
    
  2. Ainda em App.xaml.cs, adicione o seguinte código imediatamente após o OnLaunched() método:

    private async void RegisterBackgroundTask()
    {
        if (!Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name == "PushBackgroundTask"))
        {
            var result = await BackgroundExecutionManager.RequestAccessAsync();
            var builder = new BackgroundTaskBuilder();
    
            builder.Name = "PushBackgroundTask";
            builder.TaskEntryPoint = typeof(PushBackgroundComponent.PushBackgroundTask).FullName;
            builder.SetTrigger(new Windows.ApplicationModel.Background.PushNotificationTrigger());
            BackgroundTaskRegistration task = builder.Register();
        }
    }
    
  3. Adicione as seguintes using instruções na parte superior do ficheiro App.xaml.cs:

    using Windows.Networking.PushNotifications;
    using Windows.ApplicationModel.Background;
    
  4. A partir do menu Ficheiro no Visual Studio, clique em Guardar Tudo.

Criar o componente em segundo plano push

O próximo passo consiste em criar o componente em segundo plano push.

  1. No Explorador de Soluções, clique com o botão direito do rato no nó de nível superior da solução (Solução SecurePush neste caso), clique em Adicionar e, em seguida, clique em Novo Projeto.

  2. Expanda Aplicações da Loja, clique Windows Phone Aplicações e, em seguida, clique em Componente Windows Runtime (Windows Phone). Atribua um nome ao projeto PushBackgroundComponent e, em seguida, clique em OK para criar o projeto.

    Captura de ecrã a mostrar a caixa de diálogo Adicionar Novo Projeto com a opção Componente Windows Runtime (Windows Phone) Visual C# realçada.

  3. No Explorador de Soluções, clique com o botão direito do rato no projeto PushBackgroundComponent (Windows Phone 8.1), clique em Adicionar e, em seguida, clique em Classe. Atribua um nome à nova classe PushBackgroundTask.cs. Clique em Adicionar para gerar a classe.

  4. Substitua todo o conteúdo da definição do PushBackgroundComponent espaço de nomes pelo seguinte código, substituindo o marcador {back-end endpoint} de posição pelo ponto final de back-end obtido durante a implementação do back-end:

    public sealed class Notification
        {
            public int Id { get; set; }
            public string Payload { get; set; }
            public bool Read { get; set; }
        }
    
        public sealed class PushBackgroundTask : IBackgroundTask
        {
            private string GET_URL = "{back-end endpoint}/api/notifications/";
    
            async void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance)
            {
                // Store the content received from the notification so it can be retrieved from the UI.
                RawNotification raw = (RawNotification)taskInstance.TriggerDetails;
                var notificationId = raw.Content;
    
                // retrieve content
                BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
                var httpClient = new HttpClient();
                var settings = ApplicationData.Current.LocalSettings.Values;
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", (string)settings["AuthenticationToken"]);
    
                var notificationString = await httpClient.GetStringAsync(GET_URL + notificationId);
    
                var notification = JsonConvert.DeserializeObject<Notification>(notificationString);
    
                ShowToast(notification);
    
                deferral.Complete();
            }
    
            private void ShowToast(Notification notification)
            {
                ToastTemplateType toastTemplate = ToastTemplateType.ToastText01;
                XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
                XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
                toastTextElements[0].AppendChild(toastXml.CreateTextNode(notification.Payload));
                ToastNotification toast = new ToastNotification(toastXml);
                ToastNotificationManager.CreateToastNotifier().Show(toast);
            }
        }
    
  5. No Explorador de Soluções, clique com o botão direito do rato no projeto PushBackgroundComponent (Windows Phone 8.1) e, em seguida, clique em Gerir Pacotes NuGet.

  6. No lado esquerdo, clique em Online.

  7. Na caixa Procurar, escreva Cliente HTTP.

  8. Na lista de resultados, clique em Bibliotecas de Cliente MICROSOFT HTTP e, em seguida, clique em Instalar. Conclua a instalação.

  9. Na caixa Procurar no NuGet, escreva Json.net. Instale o pacote Json.NET e, em seguida, feche a janela Gestor de Pacotes NuGet.

  10. Adicione as seguintes using instruções na parte superior do PushBackgroundTask.cs ficheiro:

    using Windows.ApplicationModel.Background;
    using Windows.Networking.PushNotifications;
    using System.Net.Http;
    using Windows.Storage;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    using Windows.UI.Notifications;
    using Windows.Data.Xml.Dom;
    
  11. No Explorador de Soluções, no projeto NotifyUserWindowsPhone (Windows Phone 8.1), clique com o botão direito do rato em Referências e, em seguida, clique em Adicionar Referência.... Na caixa de diálogo Gestor de Referência, selecione a caixa junto a PushBackgroundComponent e, em seguida, clique em OK.

  12. No Explorador de Soluções, faça duplo clique em Package.appxmanifest no projeto NotifyUserWindowsPhone (Windows Phone 8.1). Em Notificações, defina Com Capacidade de Alerta como Sim.

    Captura de ecrã da janela Explorador de Soluções focada no Package.appxmanifest com a opção Compatível com Alerta definida como Sim destacada a vermelho.

  13. Ainda em Package.appxmanifest, clique no menu Declarações junto à parte superior. Na lista pendente Declarações Disponíveis , clique em Tarefas em Segundo Plano e, em seguida, clique em Adicionar.

  14. Em Package.appxmanifest, em Propriedades, selecione Notificação push.

  15. Em Package.appxmanifest, em Definições da Aplicação, escrevaPushBackgroundComponent.PushBackgroundTask no campo Ponto de Entrada.

    Captura de ecrã da janela Explorador de Soluções focada nas opções Package.appxmanifest com as opções Declarações Disponíveis, Declarações Suportadas, Notificações push e Ponto de entrada descritas a vermelho.

  16. No menu Ficheiro, clique em Guardar Tudo.

Executar a aplicação

Para executar a aplicação, faça o seguinte:

  1. No Visual Studio, execute a aplicação appBackend Web API. É apresentada uma página Web ASP.NET.
  2. No Visual Studio, execute a aplicação NotifyUserWindowsPhone (Windows Phone 8.1) Windows Phone. O emulador Windows Phone é executado e carrega a aplicação automaticamente.
  3. Na IU da aplicação NotifyUserWindowsPhone , introduza um nome de utilizador e palavra-passe. Podem ser qualquer cadeia, mas têm de ser o mesmo valor.
  4. Na IU da aplicação NotifyUserWindowsPhone , clique em Iniciar sessão e registe-se. Em seguida, clique em Enviar push.