次の方法で共有


Web API を使用して別のユーザーを偽装する

コードが別のユーザーに代わって操作を実行する必要がある場合があります。 コードを実行しているシステム アカウントに必要な特権がある場合は、他のユーザーに代わって操作を実行できます。

偽装の要件

偽装を使用して、別の Microsoft Dataverse ユーザーに代わってビジネス ロジック (コード) を実行し、偽装されたユーザーの適切なロールとオブジェクト ベースのセキュリティを使用して目的の機能またはサービスを提供します。 Dataverse Web サービスは、ワークフローやカスタム ISV (独立系ソフトウェア ベンダー) ソリューションなど、Dataverse ユーザーに代わってさまざまなクライアントやサービスによって呼び出すことができます。 偽装には 2 つの異なるユーザー アカウントが含まれ、1つのユーザー アカウント (A) が、もう一方のユーザー アカウント (B) に代わって何らかのタスクを行うコードの実行時に使用されます。

ユーザー アカウント (A) には、委任セキュリティ ロールに含まれる prvActOnBehalfOfAnotherUser 特権が必要です。 データ変更に使用される実際の特権のセットは、代理人の役割のユーザーが所有する特権と、偽装されたユーザーが所有する特権との共通部分です。 つまり、ユーザー (A) と偽装されたユーザー (B) が操作に必要な特権を持つ場合にのみ、ユーザー (A) は何かを実行できます。

ユーザーを偽装する方法

ユーザーを偽装するには、2 つの方法があります。 どちらのメソッドも、対応するユーザー ID を持つヘッダーを渡すことによって機能します。

  1. 優先: Microsoft Entra ID オブジェクトの ID に基づき、その値を CallerObjectId ヘッダーと共に渡すことにより、ユーザーを偽装します。
  2. レガシー: systemuserid に基づいてユーザーを偽装するには、対応する GUID 値で MSCRMCallerID を使用します。

この例では、Microsoft Entra ID オブジェクト ID aaaaaaaa-0000-1111-2222-bbbbbbbbbbbbを持つユーザーに代わって、新しいアカウント エンティティを作成します。

要求:

POST [Organization URI]/api/data/v9.2/accounts HTTP/1.1  
CallerObjectId: aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb  
Accept: application/json  
Content-Type: application/json; charset=utf-8  
OData-MaxVersion: 4.0  
OData-Version: 4.0  
  
{"name":"Sample Account created using impersonation"}  

応答:

HTTP/1.1 204 No Content  
OData-Version: 4.0  
OData-EntityId: [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-000000000003)  

実際のユーザーを確認する

偽装を使用してエンティティを作成するなどの操作を実行する場合は、単一値ナビゲーション プロパティを含むレコードに対してクエリを実行することで、操作を実際に実行したユーザー createdonbehalfby 見つけることができます。 エンティティを更新する操作には、対応する modifiedonbehalfby 単一値ナビゲーション プロパティを使用できます。

要求:

GET [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-000000000003)?$select=name&$expand=createdby($select=fullname),createdonbehalfby($select=fullname),owninguser($select=fullname) HTTP/1.1   
Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0  

応答:

HTTP/1.1 200 OK  
Content-Type: application/json; odata.metadata=minimal  
ETag: W/"506868"  
  
{
  "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts(name,createdby(fullname,azureactivedirectoryobjectid),createdonbehalfby(fullname,azureactivedirectoryobjectid),owninguser(fullname,azureactivedirectoryobjectid))/$entity",
  "@odata.etag": "W/\"2751197\"",
  "name": "Sample Account created using impersonation",
  "accountid": "00000000-0000-0000-000000000003",
  "createdby": {
    "@odata.etag": "W/\"2632435\"",
    "fullname": "Impersonated User",
    "azureactivedirectoryobjectid": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    "systemuserid": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "ownerid": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee"
  },
  "createdonbehalfby": {
    "@odata.etag": "W/\"2632445\"",
    "fullname": "Actual User",
    "azureactivedirectoryobjectid": "bbbbbbbb-1111-2222-3333-cccccccccccc",
    "systemuserid": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
    "ownerid": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
  },
  "owninguser": {
    "@odata.etag": "W/\"2632435\"",
    "fullname": "Impersonated User",
    "azureactivedirectoryobjectid": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    "systemuserid": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "ownerid": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee"
  }
}

参照

別のユーザーのふりをする
.NET 用 SDK を使用して別のユーザーを偽装する
Web API を使用して演算を実行する