Share via


Skicka säkra push-meddelanden från Azure Notification Hubs

Översikt

Med stöd för push-meddelanden i Microsoft Azure kan du komma åt en lätthanterad och utskalad push-infrastruktur med flera plattformar, vilket avsevärt förenklar implementeringen av push-meddelanden för både konsument- och företagsprogram för mobila plattformar.

På grund av regel- eller säkerhetsbegränsningar kanske ett program ibland vill inkludera något i meddelandet som inte kan överföras via standardinfrastrukturen för push-meddelanden. Den här självstudien beskriver hur du får samma upplevelse genom att skicka känslig information via en säker, autentiserad anslutning mellan klientenheten och appens serverdel.

På en hög nivå är flödet följande:

  1. Appens serverdel:
    • Lagrar säker nyttolast i serverdelsdatabasen.
    • Skickar ID:t för det här meddelandet till enheten (ingen säker information skickas).
  2. Appen på enheten när du tar emot meddelandet:
    • Enheten kontaktar serverdelen och begär den säkra nyttolasten.
    • Appen kan visa nyttolasten som ett meddelande på enheten.

Observera att i föregående flöde (och i den här självstudien) förutsätter vi att enheten lagrar en autentiseringstoken i lokal lagring när användaren har loggat in. Detta garanterar en helt sömlös upplevelse eftersom enheten kan hämta meddelandets säkra nyttolast med den här token. Om ditt program inte lagrar autentiseringstoken på enheten, eller om dessa token kan upphöra att gälla, bör enhetsappen vid mottagandet av meddelandet visa ett allmänt meddelande där användaren uppmanas att starta appen. Appen autentiserar sedan användaren och visar aviseringsnyttolasten.

Den här självstudien visar hur du skickar ett push-meddelande på ett säkert sätt. Självstudien bygger på självstudien Meddela användare , så du bör slutföra stegen i självstudien först.

Anteckning

Den här självstudien förutsätter att du har skapat och konfigurerat din meddelandehubb enligt beskrivningen i Skicka meddelanden till Universell Windows-plattform appar. Observera också att Windows Phone 8.1 kräver Windows-autentiseringsuppgifter (inte Windows Phone) och att bakgrundsaktiviteter inte fungerar på Windows Phone 8.0 eller Silverlight 8.1. För Windows Store-program kan du bara ta emot meddelanden via en bakgrundsaktivitet om appen är aktiverad på låsskärmen (klicka på kryssrutan i Appmanifest).

WebAPI-projekt

  1. I Visual Studio öppnar du det AppBackend-projekt som du skapade i självstudien Meddela användare .

  2. I Notifications.cs ersätter du hela klassen Meddelanden med följande kod. Se till att ersätta platshållarna med anslutningssträngen (med fullständig åtkomst) för meddelandehubben och hubbens namn. Du kan hämta dessa värden från Azure Portal. Den här modulen representerar nu de olika säkra meddelanden som ska skickas. I en fullständig implementering lagras meddelandena i en databas. för enkelhetens skull lagrar vi dem i minnet.

     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. I NotificationsController.cs ersätter du koden i klassdefinitionen NotificationsController med följande kod. Den här komponenten implementerar ett sätt för enheten att hämta meddelandet på ett säkert sätt och ger även ett sätt (i den här självstudien) att utlösa en säker push till dina enheter. Observera att när vi skickar meddelandet till meddelandehubben skickar vi bara ett råmeddelande med ID:t för meddelandet (och inget faktiskt meddelande):

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

Observera att Post metoden nu inte skickar ett popup-meddelande. Den skickar ett rådatameddelande som bara innehåller meddelande-ID:t och inte känsligt innehåll. Se också till att kommentera sändningsåtgärden för de plattformar som du inte har konfigurerat autentiseringsuppgifter för på meddelandehubben, eftersom de resulterar i fel.

  1. Nu ska vi distribuera om den här appen till en Azure-webbplats för att göra den tillgänglig från alla enheter. Högerklicka på AppBackend-projektet och välj Publicera.
  2. Välj Azure-webbplats som publiceringsmål. Logga in med ditt Azure-konto och välj en befintlig eller ny webbplats och anteckna mål-URL-egenskapen på fliken Anslutning . Vi refererar till den här URL:en som din serverdelsslutpunkt senare i den här självstudien. Klicka på Publicera.

Ändra Windows Phone projekt

  1. I projektet NotifyUserWindowsPhone lägger du till följande kod i App.xaml.cs för att registrera push-bakgrundsaktiviteten. Lägg till följande kodrad i slutet av metoden OnLaunched():

    RegisterBackgroundTask();
    
  2. Lägg till följande kod direkt efter OnLaunched() metoden i App.xaml.cs:

    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. Lägg till följande using instruktioner överst i filen App.xaml.cs:

    using Windows.Networking.PushNotifications;
    using Windows.ApplicationModel.Background;
    
  4. Klicka på Spara alla från menyn Arkiv i Visual Studio.

Skapa push-bakgrundskomponenten

Nästa steg är att skapa push-bakgrundskomponenten.

  1. I Solution Explorer högerklickar du på noden på den översta nivån i lösningen (Solution SecurePush i det här fallet), klickar sedan på Lägg till och klickar sedan på Nytt projekt.

  2. Expandera Store-appar och klicka sedan på Windows Phone Appar och klicka sedan på Windows Runtime komponent (Windows Phone). Ge projektet namnet PushBackgroundComponent och klicka sedan på OK för att skapa projektet.

    Skärmbild av dialogrutan Lägg till nytt projekt med alternativet Windows Runtime komponent (Windows Phone) Visual C# markerat.

  3. Högerklicka på projektet PushBackgroundComponent (Windows Phone 8.1) i Solution Explorer och klicka sedan på Lägg till och klicka sedan på Klass. Ge den nya klassen PushBackgroundTask.csnamnet . Klicka på Lägg till för att generera klassen.

  4. Ersätt hela innehållet i namnområdesdefinitionen PushBackgroundComponent med följande kod och ersätt platshållaren {back-end endpoint} med den serverdelsslutpunkt som hämtades när serverdelen distribuerades:

    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. Högerklicka på projektet PushBackgroundComponent (Windows Phone 8.1) i Solution Explorer och klicka sedan på Hantera NuGet-paket.

  6. Klicka på Online till vänster.

  7. Skriv Http-klient i rutan Sök.

  8. Klicka på Microsoft HTTP-klientbibliotek i resultatlistan och klicka sedan på Installera. Slutför installationen.

  9. Gå tillbaka till rutan Sök i NuGet och skriv Json.net. Installera Json.NET-paketet och stäng sedan fönstret NuGet Package Manager.

  10. Lägg till följande using instruktioner överst i PushBackgroundTask.cs filen:

    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. Högerklicka på Referenser i projektet NotifyUserWindowsPhone (Windows Phone 8.1) i Solution Explorer och klicka sedan på Lägg till referens.... I dialogrutan Referenshanterare markerar du kryssrutan bredvid PushBackgroundComponent och klickar sedan på OK.

  12. Dubbelklicka på Package.appxmanifest i projektet NotifyUserWindowsPhone (Windows Phone 8.1) i Solution Explorer. Under Meddelanden anger du Popup-kompatibel till Ja.

    Skärmbild av Solution Explorer-fönstret som fokuserar på Package.appxmanifest med alternativet Rostat bröd inställt på Ja som beskrivs i rött.

  13. Klicka på menyn Deklarationer längst upp i Package.appxmanifest. I listrutan Tillgängliga deklarationer klickar du på Bakgrundsaktiviteter och sedan på Lägg till.

  14. I Package.appxmanifest, under Egenskaper, markerar du Push-meddelande.

  15. I Package.appxmanifest, under Appinställningar, skriver du PushBackgroundComponent.PushBackgroundTask i fältet Startpunkt .

    Skärmbild av solution explorer-fönstret med fokus på Package.appxmanifest med alternativen Tillgängliga deklarationer, Deklarationer som stöds, Push-meddelanden och Startpunkt som beskrivs i rött.

  16. Från Arkiv-menyn klickar du på Spara alla.

Kör programmet

Kör programmet genom att göra följande:

  1. Kör AppBackend Web API-programmet i Visual Studio. En ASP.NET webbsida visas.
  2. I Visual Studio kör du appen NotifyUserWindowsPhone (Windows Phone 8.1) Windows Phone. Den Windows Phone emulatorn kör och läser in appen automatiskt.
  3. I användargränssnittet för NotifyUserWindowsPhone-appen anger du ett användarnamn och lösenord. Dessa kan vara valfri sträng, men de måste vara samma värde.
  4. I användargränssnittet för NotifyUserWindowsPhone-appen klickar du på Logga in och registrera dig. Klicka sedan på Skicka push.