Spring til indholdet

En gruppes medlemmer i en Power App

En personvælger, der kun viser medlemmerne af én gruppe i Entra ID, og knapper, der kun vises for gruppens medlemmer, med Office 365 Groups-connectoren. Og hvorfor det sidste ikke er en adgangskontrol.

Opdateret Power AppsMicrosoft 365 3 min. læsning

To ting, der ligner hinanden: en personvælger, hvor der kun kan vælges blandt medlemmerne af én gruppe, og dele af appen, der kun vises for gruppens medlemmer. Begge kan klares med Office 365 Groups-connectoren, som er en standardconnector (Microsoft). Metoden til personvælgeren er fra learntoilluminate.com, “Use SharePoint Group to Filter Person in PowerApps” (2021). Gruppen dér er trods titlen en gruppe i Entra ID, ikke en SharePoint-gruppe.

Gruppens id er objekt-id’et i Entra ID. Det står på gruppens side i Entra admin center.

En personvælger med kun gruppens medlemmer#

En combobox i formularen til en personkolonne, her Tildelt:

Items:
Office365Groups.ListGroupMembers("<gruppens id>", {'$top': 999}).value

DefaultSelectedItems:
If(
    !IsBlank(ThisItem.Tildelt.Email),
    Office365Users.UserProfileV2(ThisItem.Tildelt.Email)
)

I datakortets Update skal comboboxens valg laves om til den post, en personkolonne i SharePoint vil have:

{
    Claims: "i:0#.f|membership|" & Lower(DataCardValue1.Selected.mail),
    DisplayName: DataCardValue1.Selected.displayName,
    Email: DataCardValue1.Selected.mail,
    Department: "",
    JobTitle: "",
    Picture: ""
}

DataCardValue1 er comboboxen. ListGroupMembers giver 100 medlemmer som standard og højst 999 med $top (Microsoft). Med flere skal der bladres med @odata.nextLink, og det gør en combobox ikke af sig selv. Formlerne er ikke kørt. Hvordan en kolonne med flere personer håndteres, står i Saml personerne fra et personfelt med flere værdier i Power Apps.

Vis noget kun for gruppens medlemmer#

Medlemskabet slås op én gang, når appen starter, og gemmes i en variabel. I App.OnStart:

Set(varMitId, Office365Users.MyProfileV2().id);
Set(
    varErMedlem,
    !IsBlank(
        LookUp(
            Office365Groups.ListGroupMembers("<gruppens id>", {'$top': 999}).value,
            id = varMitId
        )
    )
);

Og på knappen eller skærmen: Visible: varErMedlem. Opslaget sammenligner objekt-id’er, ikke e-mail, fordi mail og brugernavnet ikke altid er det samme. Ikke kørt.

Det er ikke en adgangskontrol#

At en knap er skjult, betyder ikke, at data er beskyttet. Den, der kan se data gennem appen, har rettighederne i datakilden og kan åbne listen uden om appen. Microsoft skriver det om SQL Server, men det gælder alle datakilder: “You can’t rely on the security of data through filtering or other client-side operations to be secure” (Microsoft). Resten står i Sikkerheden i en Power App sidder i datakilden.

Skal kun gruppens medlemmer kunne rette, er det listens rettigheder, der skal sættes til gruppen. Så er varErMedlem bare det, der gør appen pæn.

Det der driller#

  • Kun direkte medlemmer. ListGroupMembers er ikke beskrevet som transitiv, så medlemmer af en gruppe i gruppen kommer ikke med. Graph kan svare på indlejret medlemskab med checkMemberGroups (op til 20 grupper pr. kald) eller transitiveMemberOf (Microsoft), men Office 365 Groups-connectorens Send an HTTP request V2 tager kun adresser under /groups, og Office 365 Users’ HTTP-handling tager kun bestemte adresser under /me og /users, ikke memberOf. Om /groups/<id>/transitiveMembers bliver taget imod under /groups, har jeg ikke efterprøvet. Ellers kræver det HTTP-handlingen i et flow, som er Premium.
  • Sikkerhedsgrupper. Microsoft siger ikke, om ListGroupMembers virker på en ren sikkerhedsgruppe eller kun på Microsoft 365-grupper. Connectoren har kendte fejl med mailaktiverede sikkerhedsgrupper, og grupper med isAssignableToRole understøttes ikke (samme side). Prøv med den gruppe, der skal bruges.
  • Grænsen for kald er 100 pr. 60 sekunder pr. forbindelse. Derfor én gang i OnStart og ikke i en galleri-formel, der kører for hver række.
  • Gæster står i gruppen med et brugernavn med #EXT#. Hvad mail er for dem, og om Claims så skal bygges af brugernavnet, har jeg ikke efterprøvet.

Alle noter