يستخدم هذا المثال خدمة App Security و Web API المجانية .NET لتنفيذ المصادقة والوصول إلى البيانات القائمة على الأدوار. قمنا بتشغيل معالج مدمج لإنشاء خدمة مصادقة جاهزة للاستخدام. تستخدم هذه الخدمة CHOTITY Framework Core للوصول إلى قاعدة بيانات. يرسل تطبيق .NET MAUI طلبات إلى خدمة API على الويب للحصول على البيانات أو تعديلها.

إذا كنت جديدًا في خدمة DevexPress .NET App Security & Web API ، فقد ترغب في مراجعة الموارد التالية:
قم بإنشاء تطبيق مستقل ويب API
حل بنقرة 1 ل CRUD API مع التحكم في الوصول القائم على الدور عبر EF Core & ASP.NET
SQL Server ، إذا قمت بتشغيل هذا الحل على Windows.
تشغيل Visual Studio كمسؤول وفتح الحل. تسمح امتيازات المسؤول لـ IDE بإنشاء قاعدة بيانات عند تشغيل مشروع خدمة الويب.
حدد webapi في القائمة المنسدلة Debug . يمكّن هذا الاختيار Kestrel كخادم الويب الخاص بتشغيل Debug.

إذا كنت تفضل IIS Express على Kestrel ، فحدد IIS Express في القائمة المنسدلة Debug . استخدم محرر نص خارجي لإضافة الكود التالي إلى .vsMAUI_WebAPIconfigapplicationhost.config :
< sites >
< site name = " WebSite1 " id = " 1 " serverAutoStart = " true " >
<!-* ... -->
< bindings >
< binding protocol = " http " bindingInformation = " *:65201:* " />
< binding protocol = " https " bindingInformation = " *:44317:* " />
< binding protocol = " https " bindingInformation = " *:44317:localhost " />
< binding protocol = " http " bindingInformation = " *:65201:localhost " />
</ bindings >
</ site >
<!-* ... -->
</ sites > انقر بزر الماوس الأيمن فوق مشروع MAUI ، واختر Set as Startup Project ، وحدد المحاكي الخاص بك. لاحظ أن الأجهزة المادية المرفقة على USB لا يمكنها الوصول إلى مضيف جهازك المحلي.
انقر بزر الماوس الأيمن فوق مشروع WebAPI وحدد Debug > Start new instance .
انقر بزر الماوس الأيمن فوق مشروع MAUI وحدد Debug > Start new instance .
تستخدم خدمة DeVexPress Web API الرموز الرموز الخاصة بـ JSON (JWT) لتفويض المستخدمين. للحصول على رمز ، تمرير اسم المستخدم وكلمة المرور إلى نقطة النهاية المصادقة . في هذا المثال ، يتم تنفيذ منطق توليد الرمز المميز في طريقة WebAPIService.RequestTokenAsync :
private async Task < HttpResponseMessage > RequestTokenAsync ( string userName , string password ) {
return await HttpClient . PostAsync ( $ " { ApiUrl } Authentication/Authenticate" ,
new StringContent ( JsonSerializer . Serialize ( new { userName , password = $ " { password } " } ) , Encoding . UTF8 ,
ApplicationJson ) ) ;
}قم بتضمين الرمز المميز في httpclient.defaultrequestheaders.Authorization. يمكن لجميع الطلبات اللاحقة الوصول إلى نقاط النهاية والبيانات الخاصة:
HttpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , await tokenResponse . Content . ReadAsStringAsync ( ) ) ;ملف للنظر في: webapiservice.cs
قمنا بتنفيذ نقاط النهاية المخصصة التالية في خدمة WebApi :
تتيح لك نقطة النهاية Candletepost إرسال طلب من جهاز محمول إلى الخدمة والتحقق مما إذا كان بإمكان المستخدم الحالي حذف المنشورات. يتيح لك ذلك إظهار/إخفاء زر الحذف في واجهة المستخدم.
ملف للنظر في: updater.cs
تقوم CurrentUser Endpoint بإرجاع معلومات حول المستخدم المصادق عليه.
ملف للنظر في: updater.cs
تسترجع نقطة نهاية GetAuthorimage صورة مؤلف بواسطة معرف المستخدم.
ملف للنظر في: updater.cs
تسترجع نقطة نهاية getPostimage صورة بواسطة معرف البريد.
ملف للنظر في: updater.cs
تقوم طريقة Updater.UpdateDatabaseAfterUpdateSchema بإنشاء المستخدمين وتحديد بيانات اعتماد تسجيل الدخول الخاصة بهم. يمكنك تعديل كلمة مرور المستخدم مباشرة في قاعدة البيانات. ملاحظة: يتيح لك إطار عمل تطبيقات .NET عبر المنصات (XAF UI) إنشاء سطح مكتب أو واجهة مستخدم ويب بسرعة تصل إلى نفس قاعدة البيانات.
ملف للنظر في: updater.cs
كائنات PermissionPolicyRole في فئة Updater أضف أذونات المستخدم. يستدعي مقتطف الكود التالي طريقة AddObjectPermissionFromLambda لتكوين دور "العارض" (اسمح للمستخدم بقراءة المنشورات المنشورة):
role . AddObjectPermissionFromLambda ( SecurityOperations . Read , p => p . IsPublished , SecurityPermissionState . Allow ) ;ملف للنظر في: updater.cs
تعدل طريقة AddTypePermissionsRecursively امتيازات دور "المحرر" (أليكس ، أنتوني ، ودينيس). تضيف الطريقة أذونات CRUD (إنشاء ، قراءة ، تحديث ، حذف) لنوع Post :
role . AddTypePermissionsRecursively < Post > ( SecurityOperations . Read | SecurityOperations . Write | SecurityOperations . Create | SecurityOperations . DeleteObject , SecurityPermissionState . Allow ) ;ملف للنظر في: updater.cs
استخدم خصائص textedit.starticon و PasswordIt.Starticon لعرض الرموز في TextedIt و PasswordEdit عناصر التحكم.
< dxe : TextEdit LabelText = " Login " StartIcon = " editorsname " .../>
< dxe : PasswordEdit LabelText = " Password " StartIcon = " editorspassword " .../>ملف للنظر في: logInPage.xaml
للتحقق من صحة إدخال المستخدم في عنصر التحكم في PasswordEdit ، استخدم editbase.haserror و editBase.ErrorText خصائص موروثة.
< dxe : PasswordEdit ... HasError = " {Binding HasError} " ErrorText = " {Binding ErrorText} " />ملف للنظر في: logInPage.xaml
public class LoginViewModel : BaseViewModel {
// ...
string errorText ;
bool hasError ;
// ...
public string ErrorText {
get => errorText ;
set => SetProperty ( ref errorText , value ) ;
}
public bool HasError {
get => hasError ;
set => SetProperty ( ref hasError , value ) ;
}
async void OnLoginClicked ( ) {
/// ...
string response = await DataStore . Authenticate ( userName , password ) ;
if ( ! string . IsNullOrEmpty ( response ) ) {
ErrorText = response ;
HasError = true ;
return ;
}
HasError = false ;
await Navigation . NavigateToAsync < SuccessViewModel > ( ) ;
}
}ملف للنظر في: loginViewModel.cs
حدد خاصية textedit.returntype الموروثة لتركيز التحكم في كلمة المرور بعد تحرير قيمة التحكم في TextedIt.
استخدم خاصية PasswordIt.ReturnCommand لتحديد أمر ( تسجيل الدخول ) الذي يتم تشغيله عندما يدخل المستخدم كلمة المرور:
< dxe : PasswordEdit ReturnCommand = " {Binding LoginCommand} " />ملف للنظر في: logInPage.xaml
public class LoginViewModel : BaseViewModel {
// ...
public LoginViewModel ( ) {
LoginCommand = new Command ( OnLoginClicked ) ;
SignUpCommand = new Command ( OnSignUpClicked ) ;
PropertyChanged +=
( _ , __ ) => LoginCommand . ChangeCanExecute ( ) ;
}
// ...
public Command LoginCommand { get ; }
public Command SignUpCommand { get ; }
// ...
}ملف للنظر في: loginViewModel.cs
قمنا بتمكين التخزين المؤقت للصور في هذا المشروع. لتحقيق ذلك ، كنا بحاجة إلى تحديد الصور بواسطة URI. لإنشاء URI ، نستخدم التعددية المتعددة التي تحصل على اسم المضيف ومعرف المؤلف/البريد. للحصول على معلومات إضافية عن تخزين المؤسسة للصور ، راجع وثائق MAUI.
< dx : DXImage >
< dx : DXImage .Source>
< MultiBinding StringFormat = " {}{0}PublicEndpoint/PostImage/{1} " >
< Binding Source = " {x:Static webService:WebAPIService.ApiUrl} " />
< Binding Path = " PostId " />
</ MultiBinding >
</ dx : DXImage .Source>
</ dx : DXImage >ملف للنظر في: headspage.xaml
طلب Android Simulator و iOS Simulator شهادة للوصول إلى خدمة عبر HTTPS. في هذا المثال ، ننتقل إلى HTTP في وضع التصحيح:
#if ! DEBUG
app . UseHttpsRedirection ( ) ;
#endif< network-security-config >
< domain-config cleartextTrafficPermitted = " true " >
< domain includeSubdomains = " true " >10.0.2.2</ domain >
</ domain-config >
</ network-security-config >< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsLocalNetworking</ key >
< true />
</ dict >يتيح لك ذلك تجاوز فحص الشهادة دون الحاجة إلى إنشاء شهادة تطوير أو تنفيذ معالجات HTTPClient.
لمزيد من المعلومات ، يرجى الرجوع إلى الاتصال بخدمات الويب المحلية من محاكاة Android ومحاكاة iOS.
نوصي باستخدام HTTP فقط عند تطوير/تصحيح طلبك. في الإنتاج ، استخدم HTTPS لأسباب أمنية.
(سيتم إعادة توجيهك إلى devexpress.com لتقديم ردك)