حول تقنيات التطبيق والتشغيل:
لغة البرمجة: سي #
FrontEnd Side: Windows Presentation Foundation (WPF) - .NET Framework 4.6.1
الجانب الخلفي: Windows Communication Foundation (WCF) - .NET Framework 4.6.1
استعادة الحزم الضرورية في المشروع المحدد، قم بتشغيل الأمر التالي في PM Console
Update-Package -reinstall
سأوضح في هذا التطبيق كيفية استخدام التفويض والمصادقة باستخدام خدمة WCF في معايير الهندسة المؤسسية.
صندوق رأس المال العامل
خدمة مصادقة ASP.NET
المصادقة المخصصة
ملفات تعريف الارتباط HTTP
سمة التفويض الرئيسي
الموضوع الحالي الرئيسي
اعتراضات الرسالة
إنشاء تطبيق خدمة WCF.
قم بإضافة AuthenticationService.svc بإعادة استخدام خدمة مصادقة ASP.NET.
إنشاء فئة التحقق من المستخدم.
تمكين المصادقة المخصصة في Global.asax.
قم بإرجاع ملف تعريف الارتباط إذا كان المستخدم صالحًا.
تعديل تكوين الخدمة.
قم بإنشاء ExecuteOperationsService.svc بثلاث طرق مختلفة تسمى SumOperation وReadOperation وWriteOperation.
تزيين أساليب الخدمة بسمة PrincipalPermission للوصول المصرح به فقط.
تزيين فئة ExecuteOperationsService مع سمة AspNetCompatibilityRequirements.
تنفيذ المعترضات في تطبيق الخادم.
قم بتنفيذ رمز إعداد الهوية للمعترضين في تطبيق الخدمة.
قم بتعديل التعليمات البرمجية من جانب الخدمة لتضمين الدور بدلاً من الاسم.
استخدم التذكرة المشفرة لتخزين اسم المستخدم والأدوار.
قم بإنشاء تطبيق العميل وأضف مراجع إلى كلتا الخدمتين.
تنفيذ المعترضات في تطبيق العميل.
قم بإنشاء مثيل خدمة المصادقة واستدعاء طريقة تسجيل الدخول ().
احصل على ملف تعريف الارتباط وقم بتخزينه.
قم بإنشاء مثيل ExecuteOperationsService واستدعاء SumOperation وReadOperation وWriteOperation.
قم بإرفاق ملف تعريف الارتباط بعميل ExecuteOperationsService
1. أضف AuthenticationService.svc لإعادة استخدام خدمة مصادقة ASP.NET.
أضف خدمة WCF جديدة وقم بتسميتها AuthenticationService.svc. احذف الملفات المرتبطة لأننا سنكشف عن خدمة مصادقة ASP.NET.
حذف AuthenticationService.cs
حذف IAuthenticationService.cs
<%@ ServiceHost Language="C#" Service="System.Web.ApplicationServices.AuthenticationService" Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. قم بتمكين المصادقة المخصصة في Global.asax وقم بإرجاع ملف تعريف الارتباط إذا كان المستخدم صالحًا.
أضف عنصرًا جديدًا Web> Global Application Class إلى المشروع.
protected void Application_Start(object sender, EventArgs e) { AuthenticationService.Authenticating += AuthenticationService_Authenticating; }
Private void AuthenticationService_Authenticating(object sender, AuthenticatingEventArgs e) { string role = string.Empty; e.Authenticated = UserIsValid(e, ref role); e.AuthenticationIsComplete = true; if (e.Authenticated) { string encryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, role)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); } }
يستخرج الأسلوب اسم المستخدم وكلمة المرور من كائن بيانات الاعتماد المخصصة لوسيطة حدث المصادقة. ثم يقوم بالتحقق من صحة اسم المستخدم وكلمة المرور من خلال فئة UserValidator الخاصة بنا.
تمثل الخاصية Authenticated صواب/خطأ إذا كان المستخدم صالحًا أم لا على التوالي.
3. تمكين خدمة المصادقة وتوافق ASP.NET
نحتاج الآن إلى تعديل ملف web.config ليشمل ما يلي:
تمكين خدمة المصادقة
تمكين توافق ASP.NET
<system.web.extensions> <البرمجة النصية> <خدمات الويب> <authenticationService Enabled="true"/> </ويب سيرفيسز> </scripting> </system.web.extensions>
4. تنفيذ الاعتراضات في تطبيق الخادم.
وذلك لأن الكود أعلاه الخاص بإرفاق ملف تعريف الارتباط بسياق العملية يبدو وكأنه مهمة شاقة في كل مرة نحتاج فيها إلى إجراء مكالمة خدمة. يمكننا نقل هذه المهام إلى الخلفية باستخدام WCF Interceptors.
MSDN: تعمل خدمات بيانات WCF على تمكين التطبيق من اعتراض رسائل الطلب بحيث يمكنك إضافة منطق مخصص إلى العملية. يمكنك استخدام هذا المنطق المخصص للتحقق من صحة البيانات في الرسائل الواردة. يمكنك أيضًا استخدامه لتقييد نطاق طلب الاستعلام بشكل أكبر، مثل إدراج سياسة تفويض مخصصة على أساس كل طلب.
فيما يلي الأنشطة المتضمنة في هذه الخطوة.
أضف سلوك المعترض داخل خادم web.config.
قم بإنشاء فئة سلوك المعترض. (انظر في المشروع)
قم بإنشاء فئة IdentityMessageInspector . (انظر في المشروع)
<system.serviceModel> <الخدمات> <اسم الخدمة = "AuthenticationAndAuthorization.ExecuteOperationsService" السلوك كونفيجوراتيون = "InterceptorBehavior" /> </الخدمات> <السلوكيات> <سلوكيات الخدمة> <السلوك> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </السلوك> <اسم السلوك = "InterceptorBehavior"> <serviceDebug includeExceptionDetailInFaults="true" /> <interceptorBehaviorExtension /> </السلوك> </serviceBehaviors> </السلوكيات> <الامتدادات> <امتدادات السلوك> <add name="interceptorBehaviorExtension" type="AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, Version=1.0.0.0, Culture=محايد"/> </behaviorExtensions> </الامتدادات> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel>
5. تشفير ملفات تعريف الارتباط.
يحتوي ملف تعريف الارتباط الخاص بنا على معلومات يمكن قراءتها بسهولة بواسطة أدوات فحص HTTP مثل Fiddler. وهذا يجعل معلومات ملفات تعريف الارتباط عرضة للتهديدات الأمنية.
FormsAuthenticationTicket : توفر مساحة الاسم System.Web.Security فئة مناسبة لنا. يمكننا تخزين معلومات اسم المستخدم والأدوار داخل مثيل الفصل هذا. توفر فئة التذكرة أيضًا تسهيلات انتهاء الصلاحية والتشفير.
Private FormsAuthenticationTicket CreateFormsAuthenticationTicket(AuthenticatingEventArgs e, string role) => new FormsAuthenticationTicket(1, e.UserName, DateTime.Now, DateTime.Now.AddHours(24), صحيح, الأدوار, FormsAuthentication.FormsCookiePath);
string encryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, role)); Private FormsAuthenticationTicket GetDecryptTicket(string encryptedTicket) => FormsAuthentication.Decrypt(encryptedTicket);
Private HttpResponseMessageProperty SetSetCookieInResponseChannelHeaders(string cookieValue) { HttpResponseMessageProperty Response = new HttpResponseMessageProperty(); Response.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; استجابة العودة؛ }
<وضع المصادقة = "النماذج"> <forms SlideExpiration="true" name="AuthCookie" حماية = "الكل" المهلة = "20"/> </المصادقة> <machineKey decryption = "AES" validation = "SHA1" decryptionKey = "1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validationKey = "33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. تنفيذ الاعتراضات في تطبيق العميل.
فيما يلي الأنشطة المتضمنة في هذه الخطوة.
أضف سلوك المعترض داخل Client App.config
قم بإنشاء فئة سلوك المعترض. (انظر في المشروع)
قم بإنشاء فئة CookieMessageInspector . (انظر في المشروع)
<السلوكيات> <endpointBehaviors> <اسم السلوك ="InterceptorBehavior"> <interceptorBehaviorExtension /> </السلوك> </endpointBehaviors> </السلوكيات>
< عنوان نقطة النهاية = "http://localhost:8046/ExecuteOperationsService.svc" ملزمة = "basicHttpBinding" BindingConfiguration = "BasicHttpBinding_IExecuteOperationsService" Contract = "ExecuteOperationsServiceReference.IExecuteOperationsService" name = "BasicHttpBinding_IExecuteOperationsService" تكوين السلوك = "InterceptorBehavior"/>