Udostępnij za pośrednictwem


Jak wyczyścić dziedziczony dostęp

W tym artykule przedstawiono sposób usuwania dziedziczonego dostępu dla rekordów, gdy kaskadowa konfiguracja tabeli zmienia się w usłudze Microsoft Dataverse.

Symptomy

Po zmianie zachowania kaskadowego relacji tabeli dla akcji Reparent lub Share na Bez kaskadowej, nadal masz dostęp do powiązanych rekordów, które powinny zostać usunięte.

Użytkownicy mogą zgłaszać nieoczekiwany dostęp do rekordów. Istnieją dwa sposoby weryfikowania dostępu do powiązanych rekordów: przy użyciu funkcji Sprawdź dostęp lub komunikatu RetrieveAccessOrigin .

Korzystanie z funkcji Sprawdź dostęp

Użyj funkcji Sprawdź dostęp w aplikacjach opartych na modelu, aby sprawdzić, kto ma dostęp do rekordu. Administratorzy mogą używać tej funkcji do sprawdzania poszczególnych użytkowników lub wszystkich użytkowników, którzy mają dostęp do rekordu.

W przypadku korzystania z narzędzia do sprawdzania dostępu zostanie wyświetlona lista przyczyn, dla których użytkownik ma dostęp. Niektóre z tych powodów wskazują, że udostępnianie zostało przyznane z powodu dostępu do powiązanego rekordu. Na przykład:

  • Rekord został mi udostępniony, ponieważ mam dostęp do powiązanego rekordu.
  • Rekord został udostępniony zespołom, których jestem członkiem, ponieważ zespół ma dostęp do powiązanego rekordu.

Używanie komunikatu RetrieveAccessOrigin

Deweloperzy mogą użyć komunikatu RetrieveAccessOrigin , aby wykryć, którzy użytkownicy mają dostęp do rekordu. Ten komunikat zwraca zdanie opisujące, dlaczego użytkownik ma dostęp. Dowolny z poniższych wyników wskazuje, że dostęp został udzielony z powodu udostępniania powiązanego rekordu:

PrincipalId is owner of a parent entity of object (<record ID>)
PrincipalId is member of team (<team ID>) who is owner of a parent entity of object (<record ID>)
PrincipalId is member of organization (<organization ID>) who is owner of a parent entity of object (<record ID>)
PrincipalId has access to (<parent record ID>) through hierarchy security. (<parent record ID>) is owner of a parent entity of object (<record ID>)

Aby uzyskać więcej informacji, zobacz Określanie, dlaczego użytkownik ma dostęp za pomocą kodu.

Przyczyna

Gdy zachowanie kaskadowe relacji tabeli ulegnie zmianie, usługa Dataverse uruchamia zadanie asynchroniczne w celu usunięcia wcześniej udzielonych użytkownikom dostępu. Jednak to zadanie może zakończyć się niepowodzeniem, co spowoduje, że użytkownicy zachowają dostęp.

Rozwiązanie

Pierwszym krokiem do rozwiązania tego problemu jest ponowne utworzenie zadania systemowego w celu usunięcia dostępu. Jeśli zadanie zakończy się niepowodzeniem, deweloper może użyć komunikatu ResetInheritedAccess , aby zastosować zmianę do określonego zestawu rekordów.

Ponowne utworzenie zadania systemowego w celu usunięcia dostępu

Deweloperzy mogą użyć komunikatu CreateAsyncJobToRevokeInheritedAccess , aby spróbować ponownie utworzyć zadanie asynchroniczne.

Użyj klasy Microsoft.Xrm.Sdk.Messages.CreateAsyncJobToRevokeInheritedAccessRequest.

/// <summary>
/// Creates and executes an asynchronous cleanup job to revoke inherited access granted through cascading inheritance.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="relationshipSchemaName">The schema name of the entity relationship.</param>
public static void CreateAsyncJobToRevokeInheritedAccessExample(IOrganizationService service, string relationshipSchemaName)
{
    var request = new Microsoft.Xrm.Sdk.Messages.CreateAsyncJobToRevokeInheritedAccessRequest()
    {
        RelationshipSchema = relationshipSchemaName
    };

    service.Execute(request);
}

Dowiedz się więcej na temat używania komunikatów z zestawem SDK dla platformy .NET.

Akcja CreateAsyncJobToRevokeInheritedAccess tworzy nowe zadanie asynchroniczne o nazwie RevokeInheritedAccess. Możesz monitorować powodzenie tego zadania. Aby uzyskać więcej informacji, zobacz Monitorowanie zadań systemowych lub zarządzanie zadaniami systemu za pomocą kodu.

Resetowanie dziedziczonego dostępu

W przypadku ponownego utworzenia zadania systemowego w celu usunięcia dostępu nie powiedzie się, deweloper z uprawnieniami administratora systemu lub konfiguratora systemu może użyć komunikatu ResetInheritedAccess do określania podzestawu pasujących rekordów. Może być konieczne użycie tego komunikatu kilka razy, aby usunąć dostęp do wszystkich rekordów.

/// <summary>
/// Resets the inherited access for the matching records.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="fetchXml">The fetchxml query.</param>
public static void OutputResetInheritedAccess(IOrganizationService service, string fetchXml)
{
    var parameters = new ParameterCollection()
    {
        { "FetchXml", fetchXml}
    };

    var request = new OrganizationRequest()
    {
        RequestName = "ResetInheritedAccess",
        Parameters = parameters
    };

    var response = service.Execute(request);

    Console.WriteLine(response.Results["ResetInheritedAccessResponse"]);
}

Dowiedz się więcej na temat używania komunikatów z zestawem SDK dla platformy .NET.

Komunikat ResetInheritedAccess próbuje wykonać synchronicznie, gdy nie ma wielu pasujących rekordów. ResetInheritedAccessResponse Następnie wartość kończy się ciągiem ExecutionMode : Sync. Jeśli istnieje wiele pasujących rekordów, operacja trwa dłużej, a wartość kończy się na ExecutionMode : Async. Zostanie utworzone zadanie systemowe o nazwie Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> i można monitorować powodzenie tego zadania. Aby uzyskać więcej informacji, zobacz Monitorowanie zadań systemowych lub zarządzanie zadaniami systemu za pomocą kodu.

Komunikat ResetInheritedAccess wymaga zapytania FetchXml w celu zidentyfikowania rekordów. To zapytanie musi spełniać następujące wymagania:

  • principalobjectaccessUżyj tabeli (POA).
  • Zwróć tylko kolumnę principalobjectaccessid .
  • Nie może zawierać żadnych link-entity elementów. Nie można dodać sprzężenia do innej tabeli.
  • Filtruj principalobjectaccess tylko kolumny tabeli.

Ta tabela jest dostępna dla internetowego interfejsu API jako typu jednostki principalobjectaccess. Nie jest on uwzględniony w dokumentacji tabeli/jednostki usługi Dataverse, ponieważ tabela POA nie obsługuje żadnej operacji bezpośredniej modyfikacji danych. Musisz znać kolumny tej tabeli, aby utworzyć zapytanie FetchXml.

Kolumny tabeli POA

Należy utworzyć zapytanie FetchXml przy użyciu tylko tych kolumn.

Nazwa logiczna Type Opis
accessrightsmask Integer Zawiera połączone wartości składowych wyliczenia AccessRights dla praw dostępu, które podmiot zabezpieczeń ma bezpośrednio.
changedon DateTime Ostatnia data zmiany dostępu podmiotu zabezpieczeń do rekordu.
inheritedaccessrightsmask Integer Zawiera połączone wartości składowych wyliczenia AccessRights dla praw dostępu, które są stosowane z powodu dziedziczenia.
objectid Unikatowy identyfikator Identyfikator rekordu, do którego ma dostęp podmiot zabezpieczeń.
objecttypecode Integer Wartość EntityMetadata.ObjectTypeCode odpowiadająca tabeli. Ta wartość nie musi być taka sama w przypadku różnych środowisk. W przypadku tabel niestandardowych jest przypisywana na podstawie kolejności, w jakiej została utworzona tabela. Aby uzyskać tę wartość, może być konieczne wyświetlenie metadanych tabeli. Istnieje kilka narzędzi społeczności, które można znaleźć. Oto rozwiązanie firmy Microsoft: przeglądanie definicji tabel w danym środowisku.
principalid Unikatowy identyfikator Identyfikator użytkownika lub zespołu, który ma dostęp.
principalobjectaccessid Unikatowy identyfikator Klucz podstawowy tabeli POA.
principaltypecode Integer Kod typu podmiotu zabezpieczeń. SystemUser = 8, Team = 9.

Następujące wartości składowych wyliczenia AccessRights mają zastosowanie do accessrightsmask kolumn iinheritedaccessrightsmask:

Typ dostępu Wartość Opis
None 0 Brak dostępu.
Read 1 Prawo do odczytywania rekordu.
Write 2 Prawo do aktualizowania rekordu.
Append 100 Prawo do dołączenia określonego rekordu do innego rekordu.
AppendTo 16 Prawo do dołączenia innego rekordu do określonego rekordu.
Create 32 Prawo do utworzenia rekordu.
Delete 65 536 Prawo do usunięcia rekordu.
Share 262,144 Prawo do udostępniania rekordu.
Assign 524,288 Prawo do przypisania określonego rekordu do innego użytkownika lub zespołu.

Może być widoczna inheritedaccessrightsmask wartość 135 069 719. Ta wartość obejmuje wszystkie typy dostępu z wyjątkiem Create, co nie jest konieczne, ponieważ te prawa dotyczą tylko rekordów, które zostały już utworzone.

Przykłady narzędzia FetchXml

Ta sekcja zawiera kilka przykładów zapytań FetchXml, których można użyć z komunikatem ResetInheritedAccess . Aby uzyskać więcej informacji, zobacz Tworzenie zapytania przy użyciu narzędzia FetchXML.

Resetowanie dziedziczonego dostępu podanego określonemu użytkownikowi dla określonego konta
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
            <condition attribute="objectid" operator="eq" value="B52B7A48-EAFB-ED11-884B-00224809B6C7" />
        </filter>
    </entity>
</fetch>
Resetowanie dostępu dziedziczonego dla wszystkich wierszy podrzędnych dla określonego typu obiektu
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Resetowanie dziedziczonego dostępu podanego określonemu użytkownikowi dla wszystkich typów obiektów
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>