เกี่ยวกับเทคโนโลยีแอปพลิเคชันและการดำเนินงาน:
ภาษาโปรแกรม: C#
ส่วนหน้า: Windows Presentation Foundation (WPF) - .NET Framework 4.6.1
ฝั่งแบ็คเอนด์: Windows Communication Foundation (WCF) - .NET Framework 4.6.1
กู้คืนแพ็คเกจที่จำเป็นในโปรเจ็กต์ที่เลือก รันคำสั่งต่อไปนี้ใน PM Console
Update-Package -reinstall
ในแอปพลิเคชันนี้ ฉันจะแสดงวิธีใช้การอนุญาตและการรับรองความถูกต้องโดยใช้บริการ WCF ในมาตรฐาน Enterprise Architecting
WCF
บริการตรวจสอบสิทธิ์ ASP.NET
การรับรองความถูกต้องแบบกำหนดเอง
คุกกี้ HTTP
คุณสมบัติการอนุญาต PrincipalPermission
กระทู้ CurrentPrincipal
ตัวดักข้อความ
สร้างแอปพลิเคชันบริการ WCF
เพิ่ม AuthenticationService.svc ที่นำบริการการรับรองความถูกต้อง ASP.NET กลับมาใช้ใหม่
สร้างคลาส User Validator
เปิดใช้งานการรับรองความถูกต้องแบบกำหนดเองใน Global.asax
ส่งคืนคุกกี้หากผู้ใช้ที่ถูกต้อง
แก้ไขการกำหนดค่าบริการ
สร้าง ExecuteOperationsService.svc ด้วยวิธีการที่แตกต่างกันสามวิธีชื่อ SumOperation, ReadOperation และ WriteOperation
ตกแต่งวิธีการบริการด้วยแอตทริบิวต์ PrincipalPermission สำหรับการเข้าถึงที่ได้รับอนุญาตเท่านั้น
ตกแต่งคลาส ExecuteOperationsService ด้วยแอตทริบิวต์ AspNetCompatibilityRequirements
ใช้ Interceptors ในแอปพลิเคชันเซิร์ฟเวอร์
นำรหัสการตั้งค่าตัวตนไปใช้กับ Interceptors ในแอปพลิเคชันบริการ
แก้ไขโค้ดฝั่งบริการเพื่อรวมบทบาทแทนชื่อ
ใช้ตั๋วที่เข้ารหัสเพื่อจัดเก็บชื่อผู้ใช้และบทบาท
สร้างแอปพลิเคชันไคลเอ็นต์และเพิ่มการอ้างอิงไปยังบริการทั้งสอง
ใช้ Interceptors ในแอปพลิเคชันไคลเอนต์
สร้างอินสแตนซ์บริการการตรวจสอบสิทธิ์และเรียกใช้เมธอด Login()
รับคุกกี้และเก็บไว้
สร้างอินสแตนซ์ ExecuteOperationsService และเรียกใช้ SumOperation, ReadOperation และ WriteOperation
แนบคุกกี้กับไคลเอนต์ ExecuteOperationsService
1. เพิ่ม AuthenticationService.svc ที่นำ ASP.NET Authentication Service กลับมาใช้ใหม่
เพิ่มบริการ WCF ใหม่และตั้งชื่อเป็น AuthenticationService.svc ลบไฟล์ที่เกี่ยวข้องเนื่องจากเรากำลังจะเปิดเผย ASP.NET Authentication Service
ลบ AuthenticationService.cs
ลบ IAuthenticationService.cs
<%@ ภาษา ServiceHost = "C#" บริการ = "System.Web.ApplicationServices.AuthenticationService" Factory = "System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. เปิดใช้งานการรับรองความถูกต้องแบบกำหนดเองใน Global.asax และส่งคืนคุกกี้หากผู้ใช้ที่ถูกต้อง
เพิ่มรายการใหม่ เว็บ > Global Application Class ลงในโปรเจ็กต์
ป้องกันเป็นโมฆะ Application_Start (ผู้ส่งวัตถุ EventArgs e) { AuthenticationService.Authenticating + = AuthenticationService_Authenticating; -
โมฆะส่วนตัว AuthenticationService_Authenticating (ผู้ส่งวัตถุ AuthenticatingEventArgs e) { บทบาทสตริง = string.Empty; e.Authenticated = UserIsValid(e, บทบาทอ้างอิง); e.AuthenticationIsComplete = จริง; if (e.Authenticated) { string encryptedValue = FormsAuthentication.Encrypt (CreateFormsAuthenticationTicket (e, บทบาท)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); -
วิธีการแยกชื่อผู้ใช้และรหัสผ่านจากวัตถุข้อมูลประจำตัวที่กำหนดเองของอาร์กิวเมนต์เหตุการณ์การรับรองความถูกต้อง จากนั้นจะตรวจสอบชื่อผู้ใช้และรหัสผ่านด้วยคลาส UserValidator ของเรา
คุณสมบัติ Authenticated แสดงถึง true / false หากผู้ใช้ถูกต้องหรือไม่ตามลำดับ
3. เปิดใช้งานบริการการรับรองความถูกต้องและความเข้ากันได้ของ ASP.NET
ตอนนี้เราจำเป็นต้องแก้ไขไฟล์ web.config เพื่อรวมสิ่งต่อไปนี้:
เปิดใช้บริการการรับรองความถูกต้อง
เปิดใช้งานความเข้ากันได้ของ ASP.NET
<system.web.extensions> <การเขียนสคริปต์> <บริการเว็บ> <authenticationService เปิดใช้งาน = "true"/> </บริการเว็บ> </สคริปต์> </system.web.extensions>
4. ใช้ Interceptors ในแอปพลิเคชันเซิร์ฟเวอร์
เนื่องจากโค้ดข้างต้นในการแนบคุกกี้เข้ากับบริบทการดำเนินการดูเหมือนจะเป็นงานที่น่าเบื่อทุกครั้งที่เราต้องเรียกใช้บริการ เราสามารถย้ายงานเหล่านี้ไปที่พื้นหลังได้โดยใช้ WCF Interceptors
MSDN: WCF Data Services ช่วยให้แอปพลิเคชันดักจับข้อความคำขอ เพื่อให้คุณสามารถเพิ่มตรรกะที่กำหนดเองให้กับการดำเนินการได้ คุณสามารถใช้ตรรกะแบบกำหนดเองนี้เพื่อตรวจสอบข้อมูลในข้อความขาเข้าได้ คุณยังสามารถใช้เพื่อจำกัดขอบเขตของคำขอสืบค้นเพิ่มเติมได้ เช่น เพื่อแทรกนโยบายการให้สิทธิ์ที่กำหนดเองตามคำขอแต่ละครั้ง
ต่อไปนี้เป็นกิจกรรมที่เกี่ยวข้องในขั้นตอนนี้
เพิ่มพฤติกรรม Interceptor ภายใน Server web.config
สร้างคลาส Interceptor Behavior (ดูในโครงการ)
สร้างคลาส IdentityMessageInspector (ดูในโครงการ)
<system.serviceModel> <บริการ> <ชื่อบริการ = "AuthenticationAndAuthorization.ExecuteOperationsService" behaviorConfiguration = "InterceptorBehavior" /> </บริการ> <พฤติกรรม> <พฤติกรรมการบริการ> <พฤติกรรม> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults = "true" / > </พฤติกรรม> <ชื่อพฤติกรรม="InterceptorBehavior"> <serviceDebug includeExceptionDetailInFaults = "true" / > <interceptorBehaviorExtension /> </พฤติกรรม> </พฤติกรรมการบริการ> </พฤติกรรม> <ส่วนขยาย> <ส่วนขยายพฤติกรรม> < เพิ่มชื่อ = "interceptorBehaviorExtension" type = "AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, เวอร์ชัน = 1.0.0.0, วัฒนธรรม = เป็นกลาง"/> </ส่วนขยายพฤติกรรม> </ส่วนขยาย> <serviceHostingEnvironment aspNetCompatibilityEnabled = "true" multipleSiteBindingsEnabled = "true" / > </system.serviceModel>
5. การเข้ารหัสคุกกี้
คุกกี้ของเราประกอบด้วยข้อมูลที่ง่ายต่อการอ่านโดยยูทิลิตี้การตรวจสอบ HTTP เช่น Fiddler ทำให้ข้อมูลคุกกี้เสี่ยงต่อภัยคุกคามด้านความปลอดภัย
FormsAuthenticationTicket : เนมสเปซ System.Web.Security จัดเตรียมคลาสที่สะดวกสำหรับเรา เราสามารถจัดเก็บข้อมูลชื่อผู้ใช้และบทบาทภายในอินสแตนซ์ของคลาสนี้ได้ ชั้นตั๋วยังมีสิ่งอำนวยความสะดวกในการหมดอายุและการเข้ารหัสอีกด้วย
FormsAuthenticationTicket ส่วนตัว CreateFormsAuthenticationTicket (AuthenticatingEventArgs e, บทบาทสตริง) => FormsAuthenticationTicket ใหม่ (1, e.UserName, DateTime.Now, DateTime.Now.AddHours (24), จริง, บทบาท, FormsAuthentication.FormsCookiePath);
string encryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, บทบาท)); FormsAuthenticationTicket GetDecryptTicket ส่วนตัว (สตริง encryptedTicket) => FormsAuthentication.Decrypt (encryptedTicket);
HttpResponseMessageProperty ส่วนตัว SetSetCookieInResponseChannelHeaders (สตริง cookieValue) { การตอบสนอง HttpResponseMessageProperty = ใหม่ HttpResponseMessageProperty (); response.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; ตอบกลับ; -
<โหมดการรับรองความถูกต้อง = "แบบฟอร์ม"> <แบบฟอร์ม scrollExpiration = "true" name = "AuthCookie" การป้องกัน = "ทั้งหมด" หมดเวลา = "20"/> </การรับรองความถูกต้อง> <machineKey ถอดรหัส = "AES" การตรวจสอบ = "SHA1" decryptionKey = "1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validationKey="33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. ใช้ Interceptors ในแอปพลิเคชันไคลเอนต์
ต่อไปนี้เป็นกิจกรรมที่เกี่ยวข้องกับขั้นตอนนี้
เพิ่มพฤติกรรม Interceptor ภายใน Client App.config
สร้างคลาส Interceptor Behavior (ดูในโครงการ)
สร้างคลาส CookieMessageInspector (ดูในโครงการ)
<พฤติกรรม> <พฤติกรรมจุดสิ้นสุด> <ชื่อพฤติกรรม ="InterceptorBehavior"> <interceptorBehaviorExtension /> </พฤติกรรม> </จุดสิ้นสุดพฤติกรรม> </พฤติกรรม>
<ที่อยู่ปลายทาง = "http://localhost:8046/ExecuteOperationsService.svc" ผูก = "basicHttpBinding" BindingConfiguration = "BasicHttpBinding_IExecuteOperationsService" สัญญา = "ExecuteOperationsServiceReference.IExecuteOperationsService" ชื่อ = "BasicHttpBinding_IExecuteOperationsService" behaviorConfiguration = "InterceptorBehavior"/>