إضافة مصادقة إلى تطبيق Windows

نظرة عامة

يوضح لك هذا الموضوع كيفية إضافة مصادقة مستندة إلى مجموعة النظراء إلى تطبيق الجوال. في هذا البرنامج التعليمي، يمكنك إضافة مصادقة إلى مشروع التشغيل السريع النظام الأساسي العام لـ Windows (UWP) لتطبيقات الأجهزة المحمولة باستخدام موفر هوية مدعوم من قبل Azure App Service. بعد المصادقة والتصريح بنجاح من قبل الواجهة الخلفية لتطبيق الجوال، يتم عرض قيمة معرف المستخدم.

يعتمد هذا البرنامج التعليمي على التشغيل السريع لتطبيقات الجوال. يجب عليك أولا إكمال البرنامج التعليمي ابدأ باستخدام تطبيقات الجوال.

سجل تطبيقك للمصادقة وقم بتكوين خدمة التطبيق

أولا، تحتاج إلى تسجيل تطبيقك في موقع موفر الهوية، وبعد ذلك ستقوم بتعيين بيانات الاعتماد التي ينشئها الموفر في الواجهة الخلفية لتطبيقات الجوال.

  1. قم بتكوين موفر الهوية المفضل لديك باتباع الإرشادات الخاصة بالموفر:

  2. كرر الخطوات السابقة لكل موفر تريد دعمه في تطبيقك.

إضافة تطبيقك إلى عناوين URL المسموح بها لإعادة التوجيه الخارجي

تتطلب المصادقة الآمنة تحديد نظام عنوان URL جديد لتطبيقك. يسمح ذلك لنظام المصادقة بإعادة التوجيه مرة أخرى إلى تطبيقك بمجرد اكتمال عملية المصادقة. في هذا البرنامج التعليمي ، نستخدم اسم تطبيق مخطط عنوان URL طوال الوقت. ومع ذلك، يمكنك استخدام أي نظام عناوين URL تختاره. يجب أن تكون فريدة من نوعها لتطبيق الهاتف المحمول الخاص بك. لتمكين إعادة التوجيه على جانب الخادم:

  1. في مدخل Azure، حدد خدمة التطبيقات.

  2. انقر على خيار قائمة المصادقة / التفويض .

  3. في عناوين URL لإعادة التوجيه الخارجي المسموح بها، أدخل url_scheme_of_your_app://easyauth.callback. url_scheme_of_your_app في هذه السلسلة هو مخطط عنوان URL لتطبيق الهاتف المحمول الخاص بك. يجب أن يتبع مواصفات عنوان URL العادية للبروتوكول (استخدم الأحرف والأرقام فقط ، وابدأ بحرف). يجب عليك تدوين السلسلة التي تختارها حيث ستحتاج إلى ضبط رمز تطبيق الهاتف المحمول الخاص بك باستخدام مخطط عنوان URL في عدة أماكن.

  4. اضغط على حفظ .

تقييد الأذونات للمستخدمين المصادق عليهم

بشكل افتراضي، يمكن استدعاء واجهات برمجة التطبيقات في الواجهة الخلفية لتطبيقات الجوال بشكل مجهول. بعد ذلك ، تحتاج إلى تقييد الوصول إلى العملاء المصادق عليهم فقط.

  • Node.js الخلفية (عبر بوابة Azure):

    في إعدادات تطبيقات الجوال، انقر فوق جداول سهلة وحدد الجدول. انقر فوق تغيير الأذونات، وحدد الوصول المصادق عليه لكافة الأذونات فقط، ثم انقر فوق حفظ.

  • نهاية خلفية .NET (C #):

    في مشروع الخادم، انتقل إلى ControllersTodoItemController>.cs. إضافة السمة [Authorize] إلى فئة TodoItemController كما يلي. لتقييد الوصول إلى طرق محددة فقط، يمكنك أيضا تطبيق هذه السمة فقط على هذه الطرق بدلا من الفصل. إعادة نشر مشروع الخادم.

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js الخلفية (عبر رمز Node.js):

    لطلب المصادقة للوصول إلى الجدول، أضف السطر التالي إلى البرنامج النصي لخادم Node.js:

      table.access = 'authenticated';
    

    لمزيد من التفاصيل، راجع كيفية: طلب المصادقة للوصول إلى الجداول. لمعرفة كيفية تنزيل مشروع رمز التشغيل السريع من موقعك، راجع كيفية: تنزيل مشروع شفرة التشغيل السريع للواجهة الخلفية Node.js باستخدام Git.

الآن ، يمكنك التحقق من تعطيل الوصول المجهول إلى الواجهة الخلفية. مع تعيين مشروع تطبيق UWP كمشروع بدء التشغيل ، قم بنشر التطبيق وتشغيله ؛ تحقق من رفع استثناء غير معالج مع رمز حالة 401 (غير مصرح به) بعد بدء تشغيل التطبيق. يحدث هذا لأن التطبيق يحاول الوصول إلى رمز تطبيق الجوال الخاص بك كمستخدم غير مصادق عليه، ولكن جدول TodoItem يتطلب الآن المصادقة.

بعد ذلك ، ستقوم بتحديث التطبيق لمصادقة المستخدمين قبل طلب الموارد من خدمة التطبيق الخاصة بك.

إضافة مصادقة إلى التطبيق

  1. في ملف مشروع تطبيق UWP MainPage.xaml.cs وإضافة مقتطف التعليمات البرمجية التالي:

     // Define a member variable for storing the signed-in user. 
     private MobileServiceUser user;
    
     // Define a method that performs the authentication process
     // using a Facebook sign-in. 
     private async System.Threading.Tasks.Task<bool> AuthenticateAsync()
     {
         string message;
         bool success = false;
         try
         {
             // Change 'MobileService' to the name of your MobileServiceClient instance.
             // Sign-in using Facebook authentication.
             user = await App.MobileService
                 .LoginAsync(MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}");
             message =
                 string.Format("You are now signed in - {0}", user.UserId);
    
             success = true;
         }
         catch (InvalidOperationException)
         {
             message = "You must log in. Login Required";
         }
    
         var dialog = new MessageDialog(message);
         dialog.Commands.Add(new UICommand("OK"));
         await dialog.ShowAsync();
         return success;
     }
    

    يقوم هذا الرمز بمصادقة المستخدم من خلال تسجيل الدخول إلى Facebook. إذا كنت تستخدم موفر هوية آخر غير فيسبوك، فقم بتغيير قيمة MobileServiceAuthenticationProvider أعلاه إلى القيمة الخاصة بموفر الخدمة.

  2. استبدال الأسلوب OnNavigatedTo() في MainPage.xaml.cs. بعد ذلك ، ستضيف زر تسجيل الدخول إلى التطبيق الذي يشغل المصادقة.

     protected override async void OnNavigatedTo(NavigationEventArgs e)
     {
         if (e.Parameter is Uri)
         {
             App.MobileService.ResumeWithURL(e.Parameter as Uri);
         }
     }
    
  3. إضافة مقتطف التعليمات البرمجية التالي إلى MainPage.xaml.cs:

     private async void ButtonLogin_Click(object sender, RoutedEventArgs e)
     {
         // Login the user and then load data from the mobile app.
         if (await AuthenticateAsync())
         {
             // Switch the buttons and load items from the mobile app.
             ButtonLogin.Visibility = Visibility.Collapsed;
             ButtonSave.Visibility = Visibility.Visible;
             //await InitLocalStoreAsync(); //offline sync support.
             await RefreshTodoItems();
         }
     }
    
  4. افتح ملف المشروع MainPage.xaml حدد موقع العنصر الذي يعرف الزر حفظ واستبدله بالتعليمة البرمجية التالية:

     <Button Name="ButtonSave" Visibility="Collapsed" Margin="0,8,8,0" 
             Click="ButtonSave_Click">
         <StackPanel Orientation="Horizontal">
             <SymbolIcon Symbol="Add"/>
             <TextBlock Margin="5">Save</TextBlock>
         </StackPanel>
     </Button>
     <Button Name="ButtonLogin" Visibility="Visible" Margin="0,8,8,0" 
             Click="ButtonLogin_Click" TabIndex="0">
         <StackPanel Orientation="Horizontal">
             <SymbolIcon Symbol="Permissions"/>
             <TextBlock Margin="5">Sign in</TextBlock> 
         </StackPanel>
     </Button>
    
  5. أضف مقتطف التعليمات البرمجية التالي إلى App.xaml.cs:

     protected override void OnActivated(IActivatedEventArgs args)
     {
         if (args.Kind == ActivationKind.Protocol)
         {
             ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;
             Frame content = Window.Current.Content as Frame;
             if (content.Content.GetType() == typeof(MainPage))
             {
                 content.Navigate(typeof(MainPage), protocolArgs.Uri);
             }
         }
         Window.Current.Activate();
         base.OnActivated(args);
     }
    
  6. افتح ملف Package.appxmanifest، وانتقل إلى الإعلانات، في القائمة المنسدلة الإعلانات المتوفرة ، وحدد البروتوكول وانقر فوق الزر إضافة . الآن تكوين خصائص إعلان البروتوكول . في اسم العرض، أضف الاسم الذي ترغب في عرضه لمستخدمي تطبيقك. في الاسم، أضف {url_scheme_of_your_app}.

  7. اضغط على المفتاح F5 لتشغيل التطبيق، وانقر فوق الزر تسجيل الدخول ، وقم بتسجيل الدخول إلى التطبيق باستخدام موفر الهوية الذي اخترته. بعد نجاح تسجيل الدخول، يتم تشغيل التطبيق بدون أخطاء ويمكنك الاستعلام عن الواجهة الخلفية وإجراء تحديثات على البيانات.

تخزين الرمز المميز للمصادقة على العميل

أظهر المثال السابق تسجيل دخول قياسي، والذي يتطلب من العميل الاتصال بكل من موفر الهوية وخدمة التطبيق في كل مرة يبدأ فيها التطبيق. لا تعد هذه الطريقة غير فعالة فحسب ، بل يمكنك أيضا مواجهة مشكلات تتعلق بالاستخدام إذا حاول العديد من العملاء بدء تشغيل التطبيق في نفس الوقت. هناك طريقة أفضل تتمثل في تخزين الرمز المميز للتخويل الذي تم إرجاعه بواسطة خدمة التطبيق الخاصة بك مؤقتا ومحاولة استخدامه أولا قبل استخدام تسجيل الدخول المستند إلى الموفر.

ملاحظة

يمكنك تخزين الرمز المميز الصادر عن App Services مؤقتا بغض النظر عما إذا كنت تستخدم المصادقة التي يديرها العميل أو تديرها الخدمة. يستخدم هذا البرنامج التعليمي المصادقة المدارة بواسطة الخدمة.

  1. في ملف المشروع MainPage.xaml.cs إضافة ما يلي باستخدام العبارات:

     using System.Linq;        
     using Windows.Security.Credentials;
    
  2. استبدال الأسلوب AuthenticateAsync بالتعليمة البرمجية التالية:

     private async System.Threading.Tasks.Task<bool> AuthenticateAsync()
     {
         string message;
         bool success = false;
    
         // This sample uses the Facebook provider.
         var provider = MobileServiceAuthenticationProvider.Facebook;
    
         // Use the PasswordVault to securely store and access credentials.
         PasswordVault vault = new PasswordVault();
         PasswordCredential credential = null;
    
         try
         {
             // Try to get an existing credential from the vault.
             credential = vault.FindAllByResource(provider.ToString()).FirstOrDefault();
         }
         catch (Exception)
         {
             // When there is no matching resource an error occurs, which we ignore.
         }
    
         if (credential != null)
         {
             // Create a user from the stored credentials.
             user = new MobileServiceUser(credential.UserName);
             credential.RetrievePassword();
             user.MobileServiceAuthenticationToken = credential.Password;
    
             // Set the user from the stored credentials.
             App.MobileService.CurrentUser = user;
    
             // Consider adding a check to determine if the token is 
             // expired, as shown in this post: https://aka.ms/jww5vp.
    
             success = true;
             message = string.Format("Cached credentials for user - {0}", user.UserId);
         }
         else
         {
             try
             {
                 // Sign in with the identity provider.
                 user = await App.MobileService
                     .LoginAsync(provider, "{url_scheme_of_your_app}");
    
                 // Create and store the user credentials.
                 credential = new PasswordCredential(provider.ToString(),
                     user.UserId, user.MobileServiceAuthenticationToken);
                 vault.Add(credential);
    
                 success = true;
                 message = string.Format("You are now signed in - {0}", user.UserId);
             }
             catch (MobileServiceInvalidOperationException)
             {
                 message = "You must sign in. Sign-In Required";
             }
         }
    
         var dialog = new MessageDialog(message);
         dialog.Commands.Add(new UICommand("OK"));
         await dialog.ShowAsync();
    
         return success;
     }
    

    في هذا الإصدار من AuthenticateAsync، يحاول التطبيق استخدام بيانات الاعتماد المخزنة في PasswordVault للوصول إلى الخدمة. يتم أيضا تسجيل الدخول المنتظم عند عدم وجود بيانات اعتماد مخزنة.

    ملاحظة

    قد تنتهي صلاحية الرمز المميز المخزن مؤقتا، ويمكن أن يحدث انتهاء صلاحية الرمز المميز أيضا بعد المصادقة عندما يكون التطبيق قيد الاستخدام. لمعرفة كيفية تحديد ما إذا كانت صلاحية الرمز المميز منتهية الصلاحية، راجع التحقق من وجود رموز مصادقة منتهية الصلاحية. للحصول على حل لمعالجة أخطاء التخويل المتعلقة بالرموز المميزة منتهية الصلاحية، راجع نشر التخزين المؤقت ومعالجة الرموز المميزة منتهية الصلاحية في مجموعة SDK المدارة من Azure Mobile Services.

  3. أعد تشغيل التطبيق مرتين.

    لاحظ أنه عند بدء التشغيل الأول، يلزم تسجيل الدخول باستخدام الموفر مرة أخرى. ومع ذلك، في إعادة التشغيل الثانية يتم استخدام بيانات الاعتماد المخزنة مؤقتا ويتم تجاوز تسجيل الدخول.

الخطوات التالية

الآن بعد أن أكملت هذا البرنامج التعليمي الأساسي للمصادقة ، فكر في المتابعة إلى أحد البرامج التعليمية التالية:

  • إضافة إشعارات فورية إلى تطبيقك
    تعرف على كيفية إضافة دعم الإعلامات المباشرة إلى تطبيقك وتكوين الواجهة الخلفية لتطبيق الجوال لاستخدام مراكز إعلامات Azure لإرسال إعلامات فورية.
  • تمكين المزامنة بلا اتصال لتطبيقك
    تعرف على كيفية إضافة دعم في وضع عدم الاتصال لتطبيقك باستخدام الواجهة الخلفية لتطبيق الجوال. تسمح المزامنة في وضع عدم الاتصال للمستخدمين النهائيين بالتفاعل مع تطبيق جوال - عرض البيانات أو إضافتها أو تعديلها - حتى في حالة عدم وجود اتصال بالشبكة.