การใช้การรับรองความถูกต้องตามใบรับรองกับ Microsoft Graph PowerShell SDK
ย้ายออกจากเซสชันแบบโต้ตอบ
ในบทความต่างๆ เช่น การอัปเดตใบอนุญาตสำหรับบัญชี Azure AD ซึ่งใช้ Microsoft Graph PowerShell SDK เพื่อเข้าถึงข้อมูล Microsoft 365 เราได้ใช้คำสั่งที่ออกในเซสชันแบบโต้ตอบ ดังที่ผมได้ชี้ให้เห็นในบทความนี้ แนวทางนี้เหมาะอย่างยิ่งสำหรับการสำรวจวิธีการทำงานของ Graph SDK cmdlets ในขณะเดียวกันก็ยังมีประเด็นสำคัญบางประการที่โปรแกรมเมอร์และผู้ดูแลระบบต้องเข้าใจอีกด้วย ปัญหาที่ร้ายแรงที่สุดคือการสะสมสิทธิ์ ซึ่งการยินยอมที่รวบรวมเมื่อเวลาผ่านไปหมายความว่าบริการหลักที่ใช้สำหรับ SDK อาจได้รับสิทธิ์มากเกินไป วิธีแก้ไขคือการใช้แอปแยกต่างหากที่ลงทะเบียนใน Azure AD โดยได้รับความยินยอมเพื่อให้สิทธิ์เพียงพอในการทำงานให้เสร็จ สิ่งนี้สร้างความท้าทายในการจัดการแต่ก็ปลอดภัยกว่ามาก
หากคุณใช้เส้นทางการใช้แอปที่ลงทะเบียนแล้ว คุณสามารถใช้การตรวจสอบสิทธิ์เฉพาะแอปแทนการเข้าถึงที่ได้รับมอบสิทธิ์ได้ การตรวจสอบสิทธิ์เฉพาะแอปหมายความว่าแอปใช้ใบรับรอง X.509 เป็นข้อมูลประจำตัว ใบรับรองสามารถลงนามด้วยตนเอง (เพื่อการทดสอบ) หรือออกโดยผู้ออกใบรับรอง เอกสารของ Microsoft สำหรับการใช้การตรวจสอบสิทธิ์เฉพาะแอปสำหรับ Microsoft Graph PowerShell SDK ประกอบด้วยขั้นตอนในการกำหนดค่าแอปที่ลงทะเบียนใน Azure AD สำหรับการตรวจสอบสิทธิ์เฉพาะแอปเท่านั้น บทความนี้ครอบคลุมประสบการณ์ของฉันในการใช้ขั้นตอนต่างๆ
รับใบรับรอง
คุณอาจไม่มีใบรับรอง X.509 รอใช้งานอยู่ แต่สามารถสร้างได้ง่ายด้วย PowerShell ตัวอย่างโค้ดนี้เรียกใช้ New-SelfSignedCertificate cmdlet เพื่อสร้างใบรับรองใหม่ที่จัดเก็บไว้ในที่เก็บใบรับรองในเครื่องของผู้ใช้ปัจจุบันบนเวิร์กสเตชันที่คำสั่งทำงาน:
$Cert = New-SelfSignedCertificate -DnsName office365itpros.onmicrosoft,com -CertStoreLocation "Cert:\CurrentUser\My" -FriendlyName "MicrosoftGraphSDK" -Subject "Test Cert for Microsoft Graph SDK"
Get-ChildItem "Cert:\CurrentUser\My\$($Cert.thumbprint)"
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
FC92991B21219F178AFB37C12DF231B6AFC3D790 CN=office365itpros.onmicrosoft
หากคุณต้องการสร้างใบรับรองในที่เก็บใบรับรองสำหรับเครื่องท้องถิ่น ให้ระบุ Cert:\LocalMachine\My เป็นที่ตั้งร้านค้า คุณสามารถสร้างใบรับรองใหม่ได้ในร้านค้าเครื่องจักรเฉพาะที่หากคุณเรียกใช้ PowerShell ในฐานะผู้ดูแลระบบ เพื่อวัตถุประสงค์ในการทดสอบ คุณสามารถจัดเก็บใบรับรองที่คุณใช้ในร้านค้าของคุณได้ เมื่อถึงเวลาที่ต้องนำบางอย่างไปใช้จริง คุณจะต้องติดตั้งใบรับรองที่แตกต่างกันในเครื่องที่จะเรียกใช้โค้ด
หลังจากสร้างใบรับรองแล้ว เราจะส่งออกเป็นไฟล์ .cer นี่คือสิ่งที่ฉันทำ:
Get-ChildItem "Cert:\CurrentUser\My\$($Cert.thumbprint)" | Export-Certificate -FilePath C:\temp\MicrosoftGraphSDK.cer
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 06/10/2021 17:01 861 MicrosoftGraphSDK.cer
การเชื่อมต่อใบรับรองกับแอป
แอปที่ลงทะเบียน Azure AD จะทำหน้าที่เป็นคอนเทนเนอร์เพื่อเก็บความยินยอมสำหรับชุดสิทธิ์อนุญาตกราฟ การอนุญาตทำให้แอปสามารถเข้าถึงข้อมูลโดยใช้การสืบค้นแบบกราฟ เมื่อสคริปต์เชื่อมต่อโดยใช้การตรวจสอบสิทธิ์เฉพาะแอพ สคริปต์จะตรวจสอบสิทธิ์โดยส่งรหัสประจำตัวของใบรับรองที่แอพรู้จัก แทนที่จะเป็นกลไกอื่น เช่น รหัสผ่านแบบโต้ตอบหรือความลับของแอพ
เพื่อให้สิ่งนี้เป็นไปได้ เราต้องโหลดไฟล์ใบรับรองที่สร้างขึ้นโดยใช้ cmdlet Export-Certificate ลงในแอป ซึ่งทำได้โดยไปที่ส่วนใบรับรองและความลับของคุณสมบัติของแอป แล้วเลือกตัวเลือกใบรับรองการอัปโหลด (รูปที่ 1)
โปรดจำไว้ว่าแอปมีสิทธิ์ที่เราต้องการใช้กับการสืบค้นกราฟ เราจำเป็นต้องเพิ่มสิทธิ์อนุญาตกราฟที่จำเป็นให้กับแอป การอนุญาตที่แน่นอนจะแตกต่างกันไปตามข้อมูลที่แอปต้องการเข้าถึง คุณสามารถทดลองได้โดยการรันโค้ดในเซสชันแบบโต้ตอบเพื่อหาชุดสิทธิ์ที่ถูกต้อง จากนั้นจึงเพิ่มลงในแอป ในรูปที่ 2 ฉันได้เพิ่มการอนุญาตแอปพลิเคชันห้ารายการตั้งแต่ Auditlog.Read.All (จำเป็นต้องอ่านข้อมูลการลงชื่อเข้าใช้ของผู้ใช้) ไปจนถึง User.Read.All (จำเป็น อ่านข้อมูลเกี่ยวกับบัญชีผู้ใช้)
โปรดทราบว่าสิทธิ์ User.Read ที่ได้รับมอบหมายจะถูกลบออก นี่เป็นการอนุญาตเริ่มต้นซึ่งเราไม่ต้องการ
การเชื่อมต่อกับ Microsoft Graph
เราต้องการข้อมูลสามส่วนเพื่อเชื่อมต่อกับกราฟโดยใช้ Connect-MgGraph cmdlet:
- ตัวระบุผู้เช่า คุณสามารถคัดลอกสิ่งนี้ได้จากคุณสมบัติของแอป
- ตัวระบุแอป นี่เป็นอีกครั้งในคุณสมบัติของแอป
- รหัสประจำตัวใบรับรอง ข้อมูลนี้มีให้เป็นคุณสมบัติของใบรับรอง (ดูตัวอย่างด้านบน)
ด้วยข้อมูลนี้ เราสามารถเรียกใช้คำสั่งเช่น (อย่าลืมแทนที่ตัวระบุผู้เช่า ตัวระบุแอป และค่ารหัสประจำตัวของใบรับรอง ตามความเหมาะสมสำหรับผู้เช่าของคุณ):
Connect-MgGraph -TenantId "a562313f-14fc-43a2-9a7a-d2e27f4f3478" -AppId "d86b1929-b818-411b-834a-206385bf5347" -CertificateThumbprint "FC92991B21219F178AFB37C12DF231B6AFC3D790"
Welcome To Microsoft Graph!
หากต้องการตรวจสอบว่าคุณได้เชื่อมต่อกับการตั้งค่าที่ถูกต้อง ให้เรียกใช้ Get-MgContext cmdlet สิ่งสำคัญที่ต้องตรวจสอบที่นี่คือการตั้งค่าอินพุตสำหรับตัวระบุไคลเอ็นต์ ตัวระบุผู้เช่า และรหัสประจำตัว รวมถึงสิทธิ์ (ขอบเขต) ที่พร้อมใช้งาน ขอบเขตบริบทควรรายงาน กระบวนการ แทนที่จะเป็น CurrentUser (การเข้าสู่ระบบแบบโต้ตอบ) และไม่ควรแสดงชื่อบัญชี
Get-MgContext
ClientId : d86b1929-b818-411b-834a-206385bf5347
TenantId : a562313f-14fc-43a2-9a7a-d2e27f4f3478
CertificateThumbprint : FC92991B21219F178AFB37C12DF231B6AFC3D790
Scopes : {Group.Read.All, MailboxSettings.Read, User.Read.All, Organization.ReadWrite.All...}
AuthType : AppOnly
AuthProviderType : ClientCredentialProvider
CertificateName :
Account :
AppName : Microsoft Graph PowerShell SDK Cert
ContextScope : Process
Certificate :
หากมีบางอย่างไม่ถูกต้อง ให้เรียกใช้ Disconnect-MgGraph cmdlet เพื่อยุติเซสชัน ย้อนกลับและตรวจสอบการตั้งค่าแอป (โดยเฉพาะ ตรวจสอบให้แน่ใจว่าได้รับความยินยอมสำหรับสิทธิ์ที่จำเป็นทั้งหมด) และลองอีกครั้ง
รหัสการทำงาน
เมื่อคุณเชื่อมต่อด้วยสิทธิ์ที่ถูกต้องเรียบร้อยแล้ว คุณก็สามารถรันโค้ดของคุณได้ ตามปกติ ข้อความแจ้งแบบโต้ตอบจะไม่ทำงาน ดังนั้นการปรับเปลี่ยนบางอย่างอาจจำเป็นต้องรับโค้ดที่สร้างขึ้นสำหรับเซสชันแบบโต้ตอบและทำให้มันทำงานในงานเบื้องหลัง หลังจากนั้น ก็เป็นเรื่องของการหารายละเอียดการปฏิบัติงาน เช่น:
- ใบรับรอง X.509 ที่จะใช้สำหรับการตรวจสอบสิทธิ์และวิธีติดตั้งในตำแหน่งที่ถูกต้อง
- วิธีส่งสคริปต์เป็นพื้นหลังงาน
- จัดการกับผลลัพธ์ (เช่น การส่งอีเมลไฟล์พร้อมผลลัพธ์ของสคริปต์)
ทั้งหมดนี้เป็นงานของอีกวัน

