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.
Jak zweryfikować dostęp do powiązanych rekordów
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:
principalobjectaccess
Uż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>