ค้นหาเว็บไซต์

การใช้การรับรองความถูกต้องตามใบรับรองกับ 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 ที่จะใช้สำหรับการตรวจสอบสิทธิ์และวิธีติดตั้งในตำแหน่งที่ถูกต้อง
  • วิธีส่งสคริปต์เป็นพื้นหลังงาน
  • จัดการกับผลลัพธ์ (เช่น การส่งอีเมลไฟล์พร้อมผลลัพธ์ของสคริปต์)

ทั้งหมดนี้เป็นงานของอีกวัน

บทความที่เกี่ยวข้อง