有时,代码需要代表其他用户执行操作。 如果运行代码的系统帐户具有必要的权限,它可以代表其他用户执行操作。
模拟身份的要求
使用模拟代表另一个 Microsoft Dataverse 用户执行业务逻辑(代码),通过使用模拟用户的适当角色和基于对象的安全性来提供所需的功能或服务。 Dataverse Web 服务可由各种客户端和服务代表 Dataverse 用户调用,例如,在工作流或自定义 ISV(独立软件供应商)解决方案中。 模拟涉及两个不同的用户帐户:一个用户帐户 (A) 用于执行代码以代表另一个用户 (B) 执行某项任务。
用户帐户(A)需要 prvActOnBehalfOfAnotherUser 特权,而该特权包含在委派安全角色中。 用于修改数据的实际权限集是“委托”角色用户所拥有的权限与被模拟用户权限的交集。 换句话说,如果用户(A)和模拟用户(B)具有操作所需的权限,则允许用户(A)执行某些操作。
如何模拟用户
可以通过两种方式模拟用户。 这两种方法都通过传递具有相应用户 ID 的标头来工作。
-
推荐方法:通过将 Microsoft Entra ID 对象 ID 值与
CallerObjectId标头一起传递,基于该 ID 模拟用户。 -
传统方法:要基于用户的 systemuserid 模拟用户,请使用
MSCRMCallerID并提供相应的 GUID 值。
在此示例中,将代表具有 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"
}
}