Så här rensar du ärvd åtkomst
Den här artikeln beskriver hur du tar bort ärvd åtkomst för poster när konfigurationen av en tabell ändras i Microsoft Dataverse.
Symptom
När det sammanhängande beteendet för en tabellrelation för åtgärden Reparent eller Share har ändrats till Ingen kaskad fortsätter du att ha åtkomst till de relaterade poster som ska tas bort.
Så här verifierar du åtkomsten till relaterade poster
Användare kan rapportera att de har oväntad åtkomst till poster. Det finns två sätt att verifiera åtkomsten till relaterade poster: med hjälp av funktionen Kontrollera åtkomst eller RetrieveAccessOrigin
meddelandet.
Använda funktionen Kontrollera åtkomst
Använd funktionen Kontrollera åtkomst i modelldrivna appar för att kontrollera vem som har åtkomst till en post. Administratörer kan använda den här funktionen för att kontrollera enskilda användare eller alla användare som har åtkomst till en post.
När du använder åtkomstkontrollen visas en lista med orsaker till varför en användare har åtkomst. Några av dessa orsaker tyder på att delning beviljades på grund av åtkomst till en relaterad post. Till exempel:
- Posten delades med mig eftersom jag har åtkomst till relaterad post.
- Posten delades med team som jag är medlem i eftersom teamet har åtkomst till relaterade poster.
Använda meddelandet RetrieveAccessOrigin
Utvecklare kan använda meddelandet RetrieveAccessOrigin
för att identifiera vilka användare som har åtkomst till en post. Det här meddelandet returnerar en mening som beskriver varför användaren har åtkomsten. Något av följande resultat indikerar att åtkomsten beviljades på grund av delning av en relaterad post:
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>)
Mer information finns i Ta reda på varför en användare har åtkomst med kod.
Orsak
När det sammanhängande beteendet för en tabellrelation ändras startar Dataverse ett asynkront jobb för att ta bort åtkomstanvändarna som tidigare beviljats. Det här jobbet kan dock misslyckas, vilket resulterar i att användare behåller åtkomsten.
Åtgärd
Det första steget för att lösa det här problemet är att återskapa systemjobbet för att ta bort åtkomsten. Om jobbet misslyckas kan en utvecklare använda ResetInheritedAccess
meddelandet för att tillämpa ändringen på en angiven uppsättning poster.
Återskapa systemjobbet för att ta bort åtkomst
Utvecklare kan använda meddelandet CreateAsyncJobToRevokeInheritedAccess
för att försöka skapa ett asynkront jobb igen.
Använd klassen 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);
}
Åtgärden CreateAsyncJobToRevokeInheritedAccess
skapar ett nytt asynkront jobb med namnet RevokeInheritedAccess
. Du kan övervaka jobbets framgång. Mer information finns i övervaka systemjobb eller hantera systemjobb med kod.
Återställa ärvd åtkomst
Om det inte går att återskapa systemjobbet för att ta bort åtkomst kan en utvecklare med behörighet som systemadministratör eller systemanpassare använda ResetInheritedAccess
meddelandet för att rikta in sig på en delmängd matchande poster. Du kan behöva använda det här meddelandet flera gånger för att ta bort åtkomsten till alla poster.
/// <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"]);
}
Meddelandet ResetInheritedAccess
försöker köra synkront när det inte finns många matchande poster. Sedan slutar värdet ResetInheritedAccessResponse
med ExecutionMode : Sync
. Om det finns många matchande poster tar åtgärden längre tid och värdet slutar med ExecutionMode : Async
. Ett systemjobb med namnet Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID>
skapas och du kan övervaka jobbets framgång. Mer information finns i övervaka systemjobb eller hantera systemjobb med kod.
Meddelandet ResetInheritedAccess
kräver en FetchXml-fråga för att identifiera posterna. Den här frågan måste uppfylla följande krav:
principalobjectaccess
Använd tabellen (POA).- Returnera endast
principalobjectaccessid
kolumnen. - Får inte innehålla några
link-entity
element. Du kan inte lägga till en koppling till en annan tabell. - Filtrera endast efter kolumner i
principalobjectaccess
tabellen.
Den här tabellen är tillgänglig för webb-API:et som principalobjectaccess-entitetstyp. Den ingår inte i dataverse-tabellen/entitetsreferensen eftersom POA-tabellen inte stöder någon form av direkt dataändringsåtgärd. Du måste känna till kolumnerna i den här tabellen för att skapa FetchXml-frågan.
POA-tabellkolumner
Du behöver bara skapa en FetchXml-fråga med hjälp av dessa kolumner.
Logiskt namn | Type | Beskrivning |
---|---|---|
accessrightsmask |
Integer | Innehåller de kombinerade AccessRights-uppräkningsmedlemsvärdena för de åtkomsträttigheter som huvudnamnet har direkt. |
changedon |
Datum/tid | Det sista datumet då huvudkontots åtkomst till posten ändrades. |
inheritedaccessrightsmask |
Integer | Innehåller de kombinerade AccessRights-uppräkningsmedlemsvärdena för de åtkomsträttigheter som tillämpas på grund av arv. |
objectid |
Unik identifierare | ID:t för posten som huvudkontot har åtkomst till. |
objecttypecode |
Integer | Värdet EntityMetadata.ObjectTypeCode som motsvarar tabellen. Det här värdet är inte nödvändigtvis detsamma för olika miljöer. För anpassade tabeller tilldelas den baserat på i vilken ordning tabellen skapades. För att få det här värdet kan du behöva visa metadata för tabellen. Det finns flera communityverktyg för att hitta detta. Här är en lösning från Microsoft: Bläddra bland tabelldefinitioner i din miljö. |
principalid |
Unik identifierare | ID:t för den användare eller det team som har åtkomst. |
principalobjectaccessid |
Unik identifierare | Primärnyckeln för POA-tabellen. |
principaltypecode |
Integer | Typkoden för huvudkontot. SystemUser = 8, Team = 9. |
Följande AccessRights-uppräkningsmedlemsvärden gäller för kolumnerna accessrightsmask
och inheritedaccessrightsmask
:
Åtkomsttyp | Värde | beskrivning |
---|---|---|
None |
0 | Ingen åtkomst. |
Read |
1 | Rätten att läsa en post. |
Write |
2 | Rätten att uppdatera en post. |
Append |
4 | Rätten att lägga till den angivna posten i en annan post. |
AppendTo |
16 | Rätten att lägga till en annan post i den angivna posten. |
Create |
32 | Rätten att skapa en post. |
Delete |
65 536 | Rätten att ta bort en post. |
Share |
262,144 | Rätten att dela en post. |
Assign |
524,288 | Rätten att tilldela den angivna posten till en annan användare eller ett annat team. |
Du kan se att värdet inheritedaccessrightsmask
ofta är 135 069 719. Det här värdet innehåller alla åtkomsttyper förutom Create
, vilket inte är nödvändigt eftersom dessa rättigheter endast gäller för poster som redan har skapats.
FetchXml-exempel
Det här avsnittet innehåller några exempel på FetchXml-frågor som du kan använda med meddelandet ResetInheritedAccess
. Mer information finns i Använda FetchXML för att konstruera en fråga.
Återställa ärvd åtkomst som ges till en viss användare för ett visst konto
<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>
Återställ ärvd åtkomst som ges till alla underordnade rader för en angiven objekttyp
<fetch>
<entity name="principalobjectaccess">
<attribute name="principalobjectaccessid"/>
<filter type="and">
<condition attribute="objecttypecode" operator="eq" value="10042" />
</filter>
</entity>
</fetch>
Återställ ärvd åtkomst som ges till en angiven användare för alla objekttyper
<fetch>
<entity name="principalobjectaccess">
<attribute name="principalobjectaccessid"/>
<filter type="and">
<condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
</filter>
</entity>
</fetch>