Push sicuro degli hub di notifica di AzureAzure Notification Hubs Secure Push

OverviewOverview

Il supporto per le notifiche push in Microsoft Azure consente di accedere a un'infrastruttura push di facile utilizzo, multipiattaforma con scalabilità orizzontale, che semplifica considerevolmente l'implementazione delle notifiche push sia per le applicazioni consumer sia per quelle aziendali per piattaforme mobili.Push notification support in Microsoft Azure enables you to access an easy-to-use, multiplatform, scaled-out push infrastructure, which greatly simplifies the implementation of push notifications for both consumer and enterprise applications for mobile platforms.

A causa di vincoli normativi o di sicurezza, un'applicazione potrebbe talvolta includere nella notifica informazioni che non è possibile trasmettere attraverso l'infrastruttura di notifiche push standard.Due to regulatory or security constraints, sometimes an application might want to include something in the notification that cannot be transmitted through the standard push notification infrastructure. In questa esercitazione viene descritto come conseguire la stessa esperienza inviando informazioni sensibili attraverso una connessione autenticata e sicura tra il dispositivo client e il back-end dell'app.This tutorial describes how to achieve the same experience by sending sensitive information through a secure, authenticated connection between the client device and the app backend.

A livello generale, il flusso è il seguente:At a high level, the flow is as follows:

  1. Il back-end dell'app:The app back-end:
    • Archivia il payload sicuro nel database back-end.Stores secure payload in back-end database.
    • Invia l'ID di questa notifica al dispositivo (non vengono inviate informazioni sicure).Sends the ID of this notification to the device (no secure information is sent).
  2. L'app sul dispositivo, quando riceve la notifica:The app on the device, when receiving the notification:
    • Il dispositivo contatta il back-end richiedendo il payload sicuro.The device contacts the back-end requesting the secure payload.
    • L'app può indicare il payload come una notifica sul dispositivo.The app can show the payload as a notification on the device.

È importante notare che nel flusso precedente e in questa esercitazione si presuppone che il dispositivo archivi un token di autenticazione nella memoria locale, dopo l’accesso dell'utente.It is important to note that in the preceding flow (and in this tutorial), we assume that the device stores an authentication token in local storage, after the user logs in. Ciò garantisce un'esperienza completamente lineare, in quanto il dispositivo può recuperare il payload sicuro della notifica tramite questo token.This guarantees a completely seamless experience, as the device can retrieve the notification’s secure payload using this token. Se invece l'applicazione non archivia i token di autenticazione nel dispositivo o se questi hanno una scadenza, l'app per dispositivo, alla ricezione della notifica, dovrà visualizzare una notifica generica in cui si richiede all'utente di avviare l'app.If your application does not store authentication tokens on the device, or if these tokens can be expired, the device app, upon receiving the notification should display a generic notification prompting the user to launch the app. L'app autentica quindi l'utente e mostra il payload di notifica.The app then authenticates the user and shows the notification payload.

In questa esercitazione sul push sicuro viene illustrato come inviare una notifica push in modo sicuro.This Secure Push tutorial shows how to send a push notification securely. Poiché i passaggi qui descritti si basano sull'esercitazione Utilizzo di Hub di notifica per inviare notifiche agli utenti , sarà prima necessario completare i passaggi di quest'ultima.The tutorial builds on the Notify Users tutorial, so you should complete the steps in that tutorial first.

Nota

Questa esercitazione presuppone che l'utente abbia creato e configurato l'hub di notifica come descritto in Introduzione ad Hub di notifica (Windows Store).This tutorial assumes that you have created and configured your notification hub as described in Getting Started with Notification Hubs (Windows Store). Si noti inoltre che Windows Phone 8.1 richiede le credenziali di Windows (non di Windows Phone) e che le attività in background non funzionano in Windows Phone 8.0 o Silverlight 8.1.Also, note that Windows Phone 8.1 requires Windows (not Windows Phone) credentials, and that background tasks do not work on Windows Phone 8.0 or Silverlight 8.1. Per le applicazioni per Windows Store, è possibile ricevere le notifiche tramite un'attività in background solo se per l'app è abilitata la schermata di blocco (fare clic sulla casella di controllo nel manifesto dell'app).For Windows Store applications, you can receive notifications via a background task only if the app is lock-screen enabled (click the checkbox in the Appmanifest).

Progetto WebAPIWebAPI Project

  1. In Visual Studio aprire il progetto AppBackend creato nell'esercitazione Notify Users (Inviare notifiche agli utenti).In Visual Studio, open the AppBackend project that you created in the Notify Users tutorial.
  2. In Notifications.cs sostituire l'intera classe Notifications con il codice seguente.In Notifications.cs, replace the whole Notifications class with the following code. Assicurarsi di sostituire i segnaposto con la stringa di connessione con accesso completo per l'hub di notifica e il nome dell'hub.Be sure to replace the placeholders with your connection string (with full access) for your notification hub, and the hub name. È possibile ottenere questi valori dal portale di Azure classico.You can obtain these values from the Azure Classic Portal. Questo modulo rappresenta ora le diverse notifiche sicure che verranno inviate.This module now represents the different secure notifications that will be sent. In un'implementazione completa le notifiche verranno archiviate in un database; per semplicità, in questo caso, verranno archiviate in memoria.In a complete implementation, the notifications will be stored in a database; for simplicity, in this case we store them in memory.

     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. In NotificationsController.cs sostituire il codice all'interno della definizione della classe NotificationsController con il codice seguente.In NotificationsController.cs, replace the code inside the NotificationsController class definition with the following code. Questo componente implementa un modo per il recupero della notifica da parte del dispositivo. Inoltre, ai fini di questa esercitazione, fornisce all'utente un modo per attivare un push sicuro ai propri dispositivi.This component implements a way for the device to retrieve the notification securely, and also provides a way (for the purposes of this tutorial) to trigger a secure push to your devices. Notare che a Hub di notifica verrà inviata una notifica non elaborata, che contiene l'ID della notifica senza alcun messaggio:Note that when sending the notification to the notification hub, we only send a raw notification with the ID of the notification (and no actual message):

    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);
     }
    

Notare che il metodo Post non invia ora una notifica di tipo avviso popup,Note that the Post method now does not send a toast notification. ma una notifica non elaborata che contiene solo l'ID notifica e non contenuto sensibile.It sends a raw notification that contains only the notification ID, and not any sensitive content. Assicurarsi inoltre di impostare come commento l'operazione send per le piattaforme per le quali non sono configurate le credenziali nell'hub di notifica, in caso contrario verranno restituiti errori.Also, make sure to comment the send operation for the platforms for which you do not have credentials configured on your notification hub, as they will result in errors.

  1. L'app verrà ora nuovamente distribuita in un sito Web di Azure in modo da renderla accessibile da tutti i dispositivi.Now we will re-deploy this app to an Azure Website in order to make it accessible from all devices. Fare clic con il pulsante destro del mouse sul progetto AppBackend e scegliere Pubblica.Right-click on the AppBackend project and select Publish.
  2. Selezionare un sito Web Azure come destinazione di pubblicazione.Select Azure Website as your publish target. Accedere con l'account di Azure e selezionare un sito Web nuovo o esistente, quindi prendere nota della proprietà URL di destinazione nella scheda Connessione. Si farà riferimento a quest'URL come endpoint back-end più avanti in questa esercitazione.Log in with your Azure account and select an existing or new Website, and make a note of the destination URL property in the Connection tab. We will refer to this URL as your backend endpoint later in this tutorial. Fare clic su Pubblica.Click Publish.

Modificare il progetto dell'app di Windows PhoneModify the Windows Phone Project

  1. Nel progetto NotifyUserWindowsPhone aggiungere il codice seguente al file App.xaml.cs per registrare l'attività di push in background.In the NotifyUserWindowsPhone project, add the following code to App.xaml.cs to register the push background task. Aggiungere la seguente riga di codice alla fine del metodo OnLaunched() :Add the following line of code at the end of the OnLaunched() method:

     RegisterBackgroundTask();
    
  2. Sempre nel file App.xaml.cs aggiungere il seguente codice immediatamente dopo il metodo OnLaunched() :Still in App.xaml.cs, add the following code immediately after the OnLaunched() method:

     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. Aggiungere le seguenti istruzioni using all'inizio del file App.xaml.cs:Add the following using statements at the top of the App.xaml.cs file:

     using Windows.Networking.PushNotifications;
     using Windows.ApplicationModel.Background;
    
  4. Scegliere Salva tutto dal menu File in Visual Studio.From the File menu in Visual Studio, click Save All.

Creare il componente push in backgroundCreate the Push Background Component

Il passaggio successivo consiste nella creazione del componente push in background.The next step is to create the push background component.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo di primo livello della soluzione (in questo caso Solution SecurePush), fare clic su Aggiungi e quindi su Nuovo progetto.In Solution Explorer, right-click the top-level node of the solution (Solution SecurePush in this case), then click Add, then click New Project.
  2. Espandere Applicazioni Windows Store, fare clic su App di Windows Phone e quindi su Componente Windows Runtime (Windows Phone).Expand Store Apps, then click Windows Phone Apps, then click Windows Runtime Component (Windows Phone). Assegnare al progetto il nome PushBackgroundComponent e quindi fare clic su OK per creare il progetto.Name the project PushBackgroundComponent, and then click OK to create the project.

  3. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto PushBackgroundComponent (Windows Phone 8.1), quindi fare clic su Aggiungi e infine su Classe.In Solution Explorer, right-click the PushBackgroundComponent (Windows Phone 8.1) project, then click Add, then click Class. Assegnare alla nuova classe il nome PushBackgroundTask.cs.Name the new class PushBackgroundTask.cs. Fare clic su Aggiungi per generare la classe.Click Add to generate the class.
  4. Sostituire l'intero contenuto della definizione dello spazio dei nomi di PushBackgroundComponent con il seguente codice e sostituire il segnaposto {back-end endpoint} con l'endpoint back-end ottenuto durante la distribuzione del back-end:Replace the entire contents of the PushBackgroundComponent namespace definition with the following code, substituting the placeholder {back-end endpoint} with the back-end endpoint obtained while deploying your 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. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto PushBackgroundComponent (Windows Phone 8.1), quindi fare clic su Gestisci pacchetti NuGet.In Solution Explorer, right-click the PushBackgroundComponent (Windows Phone 8.1) project and then click Manage NuGet Packages.
  6. Sul lato sinistro fare clic su Online.On the left-hand side, click Online.
  7. Nella casella di ricerca digitare Client Http.In the Search box, type Http Client.
  8. Nell'elenco dei risultati fare clic su Librerie client HTTP Microsoft e quindi su Installa.In the results list, click Microsoft HTTP Client Libraries, and then click Install. Completare l'installazione.Complete the installation.
  9. Di nuovo nella casella di ricerca di NuGet digitare Json.net.Back in the NuGet Search box, type Json.net. Installare il pacchetto Json.NET e quindi chiudere la finestra di Gestione pacchetti NuGet.Install the Json.NET package, then close the NuGet Package Manager window.
  10. Aggiungere le seguenti istruzioni using all'inizio del file PushBackgroundTask.cs :Add the following using statements at the top of the PushBackgroundTask.cs file:

    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. In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti nella cartella del progetto NotifyUserWindowsPhone (Windows Phone 8.1), quindi scegliere Aggiungi riferimento.... Nella finestra di dialogo Gestione riferimenti selezionare la casella di controllo accanto a PushBackgroundComponent, quindi fare clic su OK.In Solution Explorer, in the NotifyUserWindowsPhone (Windows Phone 8.1) project, right-click References, then click Add Reference.... In the Reference Manager dialog, check the box next to PushBackgroundComponent, and then click OK.
  12. In Esplora soluzioni fare doppio clic sul file Package.appxmanifest nel progetto NotifyUserWindowsPhone (Windows Phone 8.1).In Solution Explorer, double-click Package.appxmanifest in the NotifyUserWindowsPhone (Windows Phone 8.1) project. In Notifiche impostare Popup supportati su .Under Notifications, set Toast Capable to Yes.

  13. Sempre nel file Package.appxmanifest fare clic sul menu Dichiarazioni nella parte superiore.Still in Package.appxmanifest, click the Declarations menu near the top. Nell'elenco a discesa Dichiarazioni disponibili fare clic su Attività di background e quindi su Aggiungi.In the Available Declarations dropdown, click Background Tasks, and then click Add.
  14. In Package.appxmanifest, in Proprietà selezionare Notifica Push.In Package.appxmanifest, under Properties, check Push notification.
  15. Nel file Package.appxmanifest, in Impostazioni app digitare PushBackgroundComponent.PushBackgroundTask nel campo Punto di ingresso.In Package.appxmanifest, under App Settings, type PushBackgroundComponent.PushBackgroundTask in the Entry Point field.

  16. Scegliere Save All (Salva tutto) nel menu File.From the File menu, click Save All.

Esecuzione dell'applicazioneRun the Application

Per eseguire l'applicazione, eseguire le operazioni seguenti:To run the application, do the following:

  1. In Visual Studio eseguire l'applicazione API Web AppBackend .In Visual Studio, run the AppBackend Web API application. Verrà visualizzata una pagina Web ASP.NET.An ASP.NET web page is displayed.
  2. In Visual Studio eseguire l'app per Windows Phone NotifyUserWindowsPhone (Windows Phone 8.1) .In Visual Studio, run the NotifyUserWindowsPhone (Windows Phone 8.1) Windows Phone app. Verrà eseguito l'emulatore di Windows Phone e l'app verrà caricata automaticamente.The Windows Phone emulator runs and loads the app automatically.
  3. Nell'interfaccia utente dell'app NotifyUserWindowsPhone immettere un nome utente e una password.In the NotifyUserWindowsPhone app UI, enter a username and password. Può trattarsi di qualsiasi stringa, ma devono avere lo stesso valore.These can be any string, but they must be the same value.
  4. Nell'interfaccia utente dell'app NotifyUserWindowsPhone fare clic su Log in and register.In the NotifyUserWindowsPhone app UI, click Log in and register. Fare clic su Send push.Then click Send push.