Sdílet prostřednictvím


Odesílání zabezpečených nabízených oznámení ze služby Azure Notification Hubs

Přehled

Podpora nabízených oznámení v Microsoft Azure umožňuje přístup k snadno použitelné, více platformové škálované infrastruktuře nabízených oznámení, což výrazně zjednodušuje implementaci nabízených oznámení pro spotřebitelské i podnikové aplikace pro mobilní platformy.

Kvůli zákonným nebo bezpečnostním omezením může aplikace někdy chtít do oznámení zahrnout něco, co se nedá přenést přes standardní infrastrukturu nabízených oznámení. Tento kurz popisuje, jak stejného prostředí dosáhnout odesíláním citlivých informací prostřednictvím zabezpečeného a ověřeného připojení mezi klientským zařízením a back-endem aplikace.

Na vysoké úrovni je tok následující:

  1. Back-end aplikace:
    • Ukládá zabezpečenou datovou část v back-endové databázi.
    • Odešle ID tohoto oznámení do zařízení (neodesílají se žádné zabezpečené informace).
  2. Aplikace v zařízení při příjmu oznámení:
    • Zařízení kontaktuje back-end a požádá o zabezpečenou datovou část.
    • Aplikace může datovou část na zařízení zobrazit jako oznámení.

Je důležité si uvědomit, že v předchozím toku (a v tomto kurzu) předpokládáme, že zařízení po přihlášení uživatele ukládá ověřovací token v místním úložišti. To zaručuje zcela bezproblémové prostředí, protože zařízení může pomocí tohoto tokenu načíst zabezpečenou datovou část oznámení. Pokud vaše aplikace neukládá ověřovací tokeny na zařízení nebo pokud je možné tyto tokeny vyprsit, měla by aplikace zařízení po přijetí oznámení zobrazit obecné oznámení s výzvou uživatele ke spuštění aplikace. Aplikace pak uživatele ověří a zobrazí datovou část oznámení.

V tomto kurzu se dozvíte, jak bezpečně odeslat nabízené oznámení. Kurz vychází z kurzu Upozorňovat uživatele , takže byste měli nejprve dokončit kroky v tomto kurzu.

Poznámka

V tomto kurzu se předpokládá, že jste vytvořili a nakonfigurovali centrum oznámení, jak je popsáno v tématu Odesílání oznámení Univerzální platforma Windows aplikacím. Upozorňujeme také, že Windows Phone 8.1 vyžaduje přihlašovací údaje Windows (nikoli Windows Phone) a že úlohy na pozadí nefungují v Windows Phone 8.0 nebo Silverlightu 8.1. U aplikací pro Windows Store můžete dostávat oznámení prostřednictvím úlohy na pozadí jenom v případě, že je aplikace povolená na zamykací obrazovce (klikněte na zaškrtávací políčko v appmanifestu).

Projekt WebAPI

  1. V sadě Visual Studio otevřete projekt AppBackend , který jste vytvořili v kurzu Upozornit uživatele .

  2. V souboru Notifications.cs nahraďte celou třídu Notifications následujícím kódem. Zástupné symboly nahraďte připojovacím řetězcem (s úplným přístupem) pro centrum oznámení a názvem centra. Tyto hodnoty můžete získat z Azure Portal. Tento modul teď představuje různá zabezpečená oznámení, která se budou odesílat. V úplné implementaci budou oznámení uložena v databázi; Pro zjednodušení je v tomto případě ukládáme do paměti.

     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. V NotificationsController.cs nahraďte kód uvnitř NotificationsController definice třídy následujícím kódem. Tato komponenta implementuje způsob, jak zařízení bezpečně načíst oznámení, a také poskytuje způsob (pro účely tohoto kurzu) k aktivaci zabezpečeného nabízeného oznámení do vašich zařízení. Upozorňujeme, že při odesílání oznámení do centra oznámení odesíláme pouze nezpracované oznámení s ID oznámení (a žádnou skutečnou zprávou):

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

Všimněte si Post , že metoda teď neodesílá informační zprávu. Odesílá nezpracované oznámení, které obsahuje pouze ID oznámení, a ne jakýkoli citlivý obsah. Nezapomeňte také okomentovat operaci odeslání pro platformy, pro které nemáte v centru oznámení nakonfigurované přihlašovací údaje, protože výsledkem budou chyby.

  1. Teď tuto aplikaci znovu nasadíme na web Azure, aby byla přístupná ze všech zařízení. Klikněte pravým tlačítkem na projekt AppBackend a vyberte Publikovat.
  2. Jako cíl publikování vyberte Web Azure. Přihlaste se pomocí účtu Azure, vyberte existující nebo nový web a poznamenejte si vlastnost cílové adresy URL na kartě Připojení . Tuto adresu URL budeme dále v tomto kurzu označovat jako váš back-endový koncový bod . Klikněte na Publikovat.

Úprava projektu Windows Phone

  1. V projektu NotifyUserWindowsPhone přidejte do souboru App.xaml.cs následující kód, který zaregistruje úlohu push na pozadí. Přidejte následující řádek kódu na konec metody OnLaunched():

    RegisterBackgroundTask();
    
  2. V souboru App.xaml.cs přidejte následující kód hned za metodu OnLaunched() :

    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. Do horní části souboru App.xaml.cs přidejte následující using příkazy:

    using Windows.Networking.PushNotifications;
    using Windows.ApplicationModel.Background;
    
  4. Ve Visual Studiu zvolte v nabídce Soubor možnost Uložit vše.

Vytvoření komponenty na pozadí nabízených oznámení

Dalším krokem je vytvoření komponenty na pozadí nabízených oznámení.

  1. V Průzkumník řešení klikněte pravým tlačítkem na uzel nejvyšší úrovně řešení (v tomto případě Solution SecurePush), pak klikněte na Přidat a pak klikněte na Nový projekt.

  2. Rozbalte položku Aplikace pro Store, klikněte na Windows Phone Aplikace a potom klikněte na prostředí Windows Runtime Component (Windows Phone). Pojmenujte projekt PushBackgroundComponent a kliknutím na OK vytvořte projekt.

    Snímek obrazovky s dialogovým oknem Přidat nový projekt se zvýrazněnou možností Prostředí Windows Runtime Component (Windows Phone) Visual C#.

  3. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt PushBackgroundComponent (Windows Phone 8.1), pak klikněte na Přidat a pak klikněte na Třída. Pojmenujte novou třídu PushBackgroundTask.cs. Kliknutím na Přidat vygenerujte třídu.

  4. Celý obsah PushBackgroundComponent definice oboru názvů nahraďte následujícím kódem a zástupný symbol {back-end endpoint} nahraďte koncovým bodem back-endu získaným při nasazování back-endu:

    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. V Průzkumník řešení klikněte pravým tlačítkem na projekt PushBackgroundComponent (Windows Phone 8.1) a potom klikněte na Spravovat balíčky NuGet.

  6. Na levé straně klikněte na Online.

  7. Do pole Hledat zadejte Http Client.

  8. V seznamu výsledků klikněte na Klientské knihovny Microsoft HTTP a potom klikněte na Nainstalovat. Dokončete instalaci.

  9. Vraťte se do pole Hledat pro balíčky NuGet a zadejte Json.net. Nainstalujte balíček Json.NET a zavřete okno Správce balíčků NuGet.

  10. Na začátek souboru přidejte následující using příkazy PushBackgroundTask.cs :

    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. V Průzkumník řešení v projektu NotifyUserWindowsPhone (Windows Phone 8.1) klikněte pravým tlačítkem myši na Odkazy a pak klikněte na Přidat odkaz.... V dialogovém okně Správce odkazů zaškrtněte políčko vedle PushBackgroundComponent a potom klikněte na OK.

  12. V Průzkumník řešení poklikejte na Package.appxmanifest v projektu NotifyUserWindowsPhone (Windows Phone 8.1). V části Oznámení nastavte Informační zprávy naAno.

    Snímek obrazovky s oknem Průzkumník řešení zaměřeným na Package.appxmanifest s možností podporující informační zprávy nastavenou na Hodnotu Ano s červeným obrysem

  13. Stále v Package.appxmanifest klikněte na nabídku Deklarace v horní části. V rozevíracím seznamu Dostupné deklarace klikněte na Úlohy na pozadí a pak klikněte na Přidat.

  14. V Package.appxmanifest v části Vlastnosti zaškrtněte Nabízené oznámení.

  15. V Package.appxmanifest v části Nastavení aplikace zadejte PushBackgroundComponent.PushBackgroundTask do pole Vstupní bod .

    Snímek obrazovky s oknem Průzkumník řešení zaměřeným na Package.appxmanifest s červeně vyznačenými možnostmi Dostupných deklarací, Podporovaných deklarací, Nabízených oznámení a Vstupního bodu

  16. V nabídce Soubor klikněte na Uložit vše.

Spuštění aplikace

Pokud chcete aplikaci spustit, postupujte takto:

  1. V sadě Visual Studio spusťte aplikaci AppBackend Web API. Zobrazí se webová stránka ASP.NET.
  2. V sadě Visual Studio spusťte aplikaci NotifyUserWindowsPhone (Windows Phone 8.1) Windows Phone. Emulátor Windows Phone se spustí a automaticky načte aplikaci.
  3. V uživatelském rozhraní aplikace NotifyUserWindowsPhone zadejte uživatelské jméno a heslo. Může to být libovolný řetězec, ale musí to být stejná hodnota.
  4. V uživatelském rozhraní aplikace NotifyUserWindowsPhone klikněte na Přihlásit se a zaregistrovat. Pak klikněte na Odeslat nabízené oznámení.