คนนอกองค์กร (guest) เข้าพอร์ทัลไม่ได้ · สาเหตุ วิธีแก้ และสิ่งที่แก้ไปแล้วบน tenant · 26 ส.ค. 2026
| อาการ | สาเหตุจริง | ด่านที่ |
|---|---|---|
| เปิด site ไม่ได้เลย | guest ยังไม่มีสิทธิ์บน site (หรือ external sharing ปิด) | 1 |
เปิด site ได้ แต่ web part ทุกตัวขึ้น Something went wrong · TECHNICAL DETAILS บอกแค่ [object Object] |
โหลดไฟล์ JavaScript ของ web part ไม่ได้ — ไฟล์อยู่ใน App Catalog ซึ่ง guest อ่านไม่ได้ | 2 |
หน้าแรกใช้ได้ แต่กดเมนูไป site ฝ่ายแล้วขึ้น You need access |
site ฝ่ายเป็น site collection แยก มีสิทธิ์ของตัวเอง | 3 |
| ให้สิทธิ์ครบแล้ว บาง site เข้าได้ บาง site ยังไม่ได้ ทั้งที่ตั้งค่าเหมือนกัน | external sharing ปิดอยู่เฉพาะบาง site · guest ได้สิทธิ์เป็นศูนย์ทันทีไม่ว่าจะอยู่กลุ่มไหน | 4 |
ไฟล์ bundle ของ SPFx ถูกเก็บใน App Catalog เพราะ config/package-solution.json ตั้งไว้ว่า:
"includeClientSideAssets": true
สิทธิ์ตั้งต้นของ App Catalog ที่อ่านมาจาก API จริงคือ:
Everyone except external users → Read ReadOnlyAccessToTenantAdminSite → Read
Everyone except external users แปลตรงตัวว่ายกเว้น guest — คนในองค์กรจึงใช้ได้ปกติ ส่วน guest พังทุก web part
และไม่มีข้อความไหนบอกว่าเกี่ยวกับ App Catalog เลย
| ที่ | ทำอะไร | วิธี |
|---|---|---|
/sites/appcatalog | ให้ NTL - Employee สิทธิ์ Read | role assignment ตรง (site นี้ไม่มีกลุ่ม SharePoint) |
/sites/ntl-hr | ใส่ NTL - Employee ในกลุ่ม Visitors | REST |
/sites/ntl-it | ใส่ NTL - Employee ในกลุ่ม Visitors | REST |
/sites/ntl-branch | ใส่ NTL - Employee ในกลุ่ม Visitors | REST |
/sites/ntl-hr · /sites/ntl-it | เปิด external sharing เป็น New and existing guests | SharePoint admin center → Active sites → Sharing |
/sites/ntl-poc มี NTL - Employee เป็น Visitors และเปิด sharing อยู่ก่อนแล้ว
ผลตรวจหลังแก้ครบ — ถาม SharePoint ว่าคำนวณสิทธิ์ของ guest ได้เท่าไรในแต่ละ site:
/sites/ntl-poc sharing=true Low=138612833 High=176 ✓ /sites/ntl-hr sharing=true Low=138612833 High=176 ✓ /sites/ntl-it sharing=true Low=138612833 High=176 ✓ /sites/ntl-branch sharing=true Low=138612833 High=176 ✓
NTL - Employee เข้าได้ครบทั้ง 4 site และ web part ทำงานทุกตัว ·
ค่าที่วัดได้เท่ากันทุก site จึงยืนยันได้ว่าไม่ได้เหลือ site ไหนตกหล่น
หลังให้สิทธิ์กลุ่มครบทั้งสาม site ฝ่ายแล้ว ยังเข้าได้แค่ site เดียว · ตรวจด้วย API พบว่าต่างกันจุดเดียว:
GET {site}/_api/site?$select=ShareByEmailEnabled
/sites/ntl-branch true ← guest เข้าได้
/sites/ntl-hr false ← guest เข้าไม่ได้
/sites/ntl-it false ← guest เข้าไม่ได้
ยืนยันซ้ำด้วยการถาม SharePoint ว่าคำนวณสิทธิ์ของ guest คนนั้นได้เท่าไร:
GET {site}/_api/web/getusereffectivepermissions(@u)?@u='i:0%23.f|membership|<guest>'
/sites/ntl-poc Low=138612833 High=176 ← มีสิทธิ์
/sites/ntl-hr Low=0 High=0 ← ศูนย์ ทั้งที่อยู่ในกลุ่ม Visitors
external sharing ที่ปิดอยู่ ลบสิทธิ์ของ guest ทิ้งทั้งหมด ไม่ว่าจะให้สิทธิ์ไว้แค่ไหน · และ site ที่สร้างด้วยสคริปต์จะได้ค่านี้ตามค่าเริ่มต้นตอนสร้าง ซึ่งอาจไม่เหมือนกันทุกตัว
แก้: SharePoint admin center → Active sites → เลือก site → Sharing → New and existing guests → Save · ต้องทำทีละ site
getusereffectivepermissions บอกว่า SharePoint คำนวณสิทธิ์ของคนคนนั้นได้เท่าไรจริง ๆ ·
ถ้าได้ 0 ทั้งที่หน้าจอสิทธิ์ดูถูกต้องหมด แปลว่ามีอะไรบางอย่างลบสิทธิ์ทิ้งทั้งชั้น ซึ่งมักเป็น external sharing
หรือ Conditional Access ไม่ใช่การตั้ง permission ผิด
c:0t.c|tenant|<object id ของกลุ่ม>
c:0t.c|tenant|49bcd89c-c295-4d62-9fd6-63fe1bcadc66ใช้เครื่องมือใน repo · เปิดเบราว์เซอร์ให้ล็อกอินครั้งเดียว แล้วดึง token จากหน้า admin ที่ deploy ไว้
// ในโฟลเดอร์ ntl-admin
import { AUDIENCE, grabTokens } from "./scripts/browserToken.ts";
const t = await grabTokens({
want: [AUDIENCE.sharepoint],
startPath: "/pages",
adminUrl: "https://sharepoint-admin.codemonday.io",
});
POST {site}/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.ClientPeoplePickerSearchUser
{ "queryParams": { "QueryString": "NTL - Employee", "PrincipalType": 4,
"PrincipalSource": 15, "MaximumEntitySuggestions": 20 } }
คืนค่า Key มาให้ ซึ่งก็คือ c:0t.c|tenant|<guid>
POST {site}/_api/web/ensureuser
{ "logonName": "c:0t.c|tenant|<guid>" } // ได้ principal Id กลับมา
// ทาง A · site มีกลุ่ม Visitors อยู่แล้ว (site ทั่วไป) GET {site}/_api/web/associatedvisitorgroup POST {site}/_api/web/sitegroups(<id>)/users { "__metadata": { "type": "SP.User" }, "LoginName": "c:0t.c|tenant|<guid>" } // ทาง B · ไม่มีกลุ่ม เช่น App Catalog GET {site}/_api/web/roledefinitions/getbyname('Read') // Read = 1073741826 POST {site}/_api/web/roleassignments/addroleassignment(principalid=<pid>,roledefid=<rid>)
GET {site}/_api/web/roleassignments?$expand=Member,RoleDefinitionBindings
NTL - Employee ก็พอ ไม่ต้องแตะสิทธิ์ site อีกEveryone except external users เป็นค่าเริ่มต้นที่โผล่หลายที่ในSharePoint
และตัด guest ออกเงียบ ๆ ทุกครั้งโดยไม่มี error ที่ชี้ต้นเหตุ