惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
IT之家
IT之家
Vercel News
Vercel News
C
Check Point Blog
Google DeepMind News
Google DeepMind News
月光博客
月光博客
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog

Red Canary

Intelligence Insights: August 2026 | Red Canary Intelligence Insights: July 2026 | Red Canary Train, triage, repeat: The AI agent changing how we fight phishing | Red Canary Intelligence Insights: June 2026 | Red Canary The dual-use dilemma: Rethinking detection for remote access tool abuse | Red Canary How threat hunting evolves at scale Red Canary CFP tracker: May 2026 Investigating suspicious AI workflows in Microsoft Entra Agent ID: Agent’s user account Grading on a curve: How to assess a pentest Investigating suspicious AI workflows in Microsoft Entra Agent ID: Autonomous agents Intelligence Insights: May 2026 Investigating server compromises with cgroups: A Linux DFIR primer Spring cleaning your browser Red Canary CFP tracker: May 2026 How AI can streamline your security testing Intelligence Insights: April 2026 Identity, browsers, and node.js: Everything you missed in the Threat Detection Report miniseries New: Use response actions to update Zscaler policies and block threats AI in cybersecurity: The good, the bad, and the FUD Red Canary CFP tracker: April 2026 Scarlet Goldfinch’s year in ClickFix Intelligence Insights: March 2026 AI and browser threats stand out in the 2026 Threat Detection Report Moving up the Assemblyline: Exposing malicious code in browser extensions The RSAC 2026 Conference talks worth catching Hunting for malicious OpenClaw AI in the modern enterprise Breaking down a supply chain attack leveraging a malicious Google Workspace OAuth app Red Canary CFP tracker: March 2026
Investigating suspicious AI workflows in Microsoft Entra ...
Susannah Matt · 2026-06-08 · via Red Canary

In this third and final installment on investigating Microsoft Entra Agent ID events, we’ll highlight one last agent authentication scenario: assistive agents, aka the On behalf of flow (OBO).

According to Microsoft’s documentation:

“…assistive agents (also called interactive agents) perform specific tasks on demand on behalf of a signed-in user, often through a chat interface. Tasks include analyzing customer data for sales recommendations or answering support questions with escalation to human representatives. These agents are granted Microsoft Entra delegated permissions that allow them to act on behalf of users. Common scenarios include customer support assistants, research helpers, and real-time collaboration agents.”

For example, imagine starting a Copilot chat in Entra where you prompt the agent to perform certain administrative tasks based on the roles and permissions granted to your user.

In order for a user to grant an agent permission to act on its behalf, the user first needs to grant access to the agent’s underlying blueprint principal by requesting its access_agent scope. This means that the agent blueprint, per sparse documentation, needs to implement the access_agent scope in order to support an OBO flow. In the scenario that will follow, the user, matt@ContosoCorp.onmicrosoft.com, consented to the access_agent scope of the Dev Agent Identity Blueprint - NOT FOR PROD blueprint principal, which was highlighted in previous posts, by navigating to the following URI:

https://login.microsoftonline.com/adcb5820-70a1-4272-b79c-32f2bba44ddc/oauth2/v2.0/authorize?client_id=14d82eec-204b-4c2f-b7e8-296a70dab67e&response_type=code&redirect_uri=http://localhost/&response_mode=query&scope=api://beddadf7-4f3b-4e9b-8443-0b0cf777446e/access_agent

The components in the URI are as follows:

  • adcb5820-70a1-4272-b79c-32f2bba44ddc: The user’s Entra tenant ID
  • 14d82eec-204b-4c2f-b7e8-296a70dab67e : The Entra client application to which you want to grant access_agent. This GUID corresponds to the Microsoft Graph Command Line Tools app.
  • http://localhost/: The redirect URI for the Microsoft Graph Command Line Tools app. Note: This is what enabled me to capture the resulting authorization code locally, which I was then able to use to request an access token targeting the agent blueprint principal. For additional reference, localhost redirects are also abused by adversaries employing the ConsentFix technique.
  • beddadf7-4f3b-4e9b-8443-0b0cf777446e: The agent blueprint to which the user is consenting.

The consent dialog will appear as the following:

Permissions request for Microsoft Graph Command Line Tools

With consent granted, at this point an agent can now act on behalf of the user, however, the actual authorization granted will consist of the intersection of the permissions granted to the agent identity and the assigned roles of the user. As highlighted in Part 1, most dangerous permissions (e.g., User.ReadWrite.All) cannot be granted to an agent in order to minimize the potential for damage. That certainly doesn’t mean that an agent can’t be influenced (or when compromised) to perform malicious activity.

We’ll now investigate a scenario where an agent acting on behalf of a user sent a suspicious email.

Scenario: An agent sends a suspicious email on behalf of a human identity

A suspicious email with “invoice” in the subject line was sent to an external email address. Here is the raw Purview log that we’ll break down and use as the basis for building out a minimum viable story:

{
  "AgentBlueprintId": "beddadf7-4f3b-4e9b-8443-0b0cf777446e",
  "AgentId": "8cd0a10f-0be8-413a-9bf2-f44bc568d1e4",
  "AppAccessContext": {
    "AADSessionId": "003066ba-089b-fe8a-f68e-78764ba250c4",
    "APIId": "00000003-0000-0000-c000-000000000000",
    "ClientAppId": "8cd0a10f-0be8-413a-9bf2-f44bc568d1e4",
    "IssuedAtTime": "2026-05-08T15:21:45",
    "UniqueTokenId": "G3_-L_huWkKI8Larz0xVAA"
  },
  "CreationTime": "2026-05-08T15:27:05",
  "Id": "d8727a2e-67e7-403a-cc72-08dead16430e",
  "Operation": "Send",
  "OrganizationId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "RecordType": 2,
  "ResultStatus": "Succeeded",
  "SubjectType": "3 8",
  "UserKey": "00000000-0000-0000-0000-000000000000",
  "UserType": 11,
  "Version": 1,
  "Workload": "Exchange",
  "ClientIP": "40.126.23.26",
  "UserId": "matt@ContosoCorp.onmicrosoft.com",
  "ActorInfoString": "Client=REST;Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1[AppId=8cd0a10f-0be8-413a-9bf2-f44bc568d1e4];",
  "AppId": "00000003-0000-0000-c000-000000000000",
  "AuthType": "MSAuth1.0",
  "ClientIPAddress": "40.126.23.26",
  "ClientInfoString": "Client=REST;;",
  "ClientRequestId": "eea70650-ba24-4bde-9e6b-31684bf172ad",
  "ExternalAccess": false,
  "HostAppId": "c999ed3e-27ae-4cb3-b3a2-46b056af63d3",
  "InternalLogonType": 0,
  "LogonType": 0,
  "LogonUserSid": "S-1-5-21-835130139-2367991628-4097896528-11684066",
  "MailboxGuid": "b9ef9602-e111-403c-94c2-34ec7311ff8a",
  "MailboxOwnerSid": "S-1-5-21-835130139-2367991628-4097896528-11684066",
  "MailboxOwnerUPN": "matt@ContosoCorp.onmicrosoft.com",
  "OrganizationName": "ContosoCorp.onmicrosoft.com",
  "OriginatingServer": "DM3P220MB1171 (15.20.4200.000)\r\n",
  "SessionId": "003066ba-089b-fe8a-f68e-78764ba250c4",
  "TokenObjectId": "986b1d1b-d0b4-4ee6-bb5b-02e58d437abe",
  "TokenTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "TokenType": "AadPft",
  "Item": {
    "Id": "RgAAAAAH+eMyr+SxTrjx7QJPl98wBwD1xVtvhDVGTKuBZrgrF26wAAAAAAEPAAD1xVtvhDVGTKuBZrgrF26wAAMEB59wAAAJ",
    "ImmutableId": "LgAAAAAdhAMRqmYRzZvIAKoAL8RaDQD1xVtvhDVGTKuBZrgrF26wAAMECBTpAAAJ",
    "InternetMessageId": "<DM3P220MB117179B5327655E440A44AC3E93D2@DM3P220MB1171.NAMP220.PROD.OUTLOOK.COM>",
    "ParentFolder": {
      "Id": "LgAAAAAH+eMyr+SxTrjx7QJPl98wAQD1xVtvhDVGTKuBZrgrF26wAAAAAAEPAAAB",
      "Path": "\\Drafts"
    },
    "Recipients": [
      {
        "Address": "bigwig_CFO@importantcompany.com",
        "Name": "bigwig_CFO@importantcompany.com"
      }
    ],
    "RecipientsCount": 1,
    "SizeInBytes": 2790,
    "Subject": "Here is your invoice"
  },
  "SaveToSentItems": false
}

This event can be summarized as follows:

At 2026-05-08T15:27:05Z, within Entra ID tenant ID adcb5820-70a1-4272-b79c-32f2bba44ddc, the agent identity 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4 sent an email on behalf of matt@ContosoCorp.onmicrosoft.com to bigwig_CFO@importantcompany.com with a subject line of “Here is your invoice”. The email originated from IP address 40.126.23.26 using the following user-agent string: Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1

Field derivation for the event summary:

QuestionField nameValue
WhoAgentId, UserId8cd0a10f-0be8-413a-9bf2-f44bc568d1e4,

matt@ContosoCorp.onmicrosoft.com

WhatWorkload, Operation,
Recipients.Address,
Subject
Exchange, Send,
bigwig_CFO@importantcompany.com,
Here is your invoice
WhenCreationTime2026-05-08T15:27:05
WhereOrganizationIdadcb5820-70a1-4272-b79c-32f2bba44ddc
WhenceClientIP40.126.23.26, which is a MSFT IP. Is this reliable?
HowActorInfoStringMozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1

What questions remain that would help fill in any missing details?

  1. When did matt@ContosoCorp.onmicrosoft.com authenticate and from where? The IP address is Microsoft infrastructure. Did matt@ContosoCorp.onmicrosoft.com authenticate and make the request to send that message from that IP address?
  2. How did matt@ContosoCorp.onmicrosoft.com grant access to the 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4 agent identity.
  3. What is the 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4 agent identity?

To address the first question and to confirm the means by which the email was sent, we have enough information in the event above to directly correlate the exact Graph API request. The following fields will be used to perform correlation to the specific, corresponding MicrosoftGraphActivityLogs event:

Original log tableField nameLog table to correlate toCorrelated field name
Purview -
Exchange
AppAccessContext.
UniqueTokenId
MicrosoftGraphActivityLogsSignInActivityId
Purview -
Exchange
ClientRequestIdMicrosoftGraphActivityLogsClientRequestId

Corresponding Graph API activity

When correlated, the corresponding Graph API log confirms that the Graph API was used to send the email along with the true IP address, 51.3.97.221:

{             
  "TenantId": "855f09b2-b284-45cb-af48-6d9ee72abb2b",
  "TimeGenerated": "2026-05-08T15:27:05.9217985Z",
  "Location": "East US",
  "RequestId": "e79793d3-148b-47a4-be4b-af5120b39e00",
  "OperationId": "e79793d3-148b-47a4-be4b-af5120b39e00",
  "ClientRequestId": "eea70650-ba24-4bde-9e6b-31684bf172ad",
  "ApiVersion": "beta",
  "RequestMethod": "POST",
  "ResponseStatusCode": "202",
  "AadTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "IPAddress": "51.3.97.221",
  "UserAgent": "Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1",
  "RequestUri": "https://graph.microsoft.com/beta/users/matt@ContosoCorp.onmicrosoft.com/microsoft.graph.sendMail",
  "DurationMs": "4626806",
  "ResponseSizeBytes": "0",
  "SignInActivityId": "G3_-L_huWkKI8Larz0xVAA",
  "Roles": "",
  "SessionId": "003066ba-089b-fe8a-f68e-78764ba250c4",
  "DeviceId": "",
  "UniqueTokenId": "",
  "TokenIssuedAt": "2026-05-08T15:21:45Z",
  "AppId": "8cd0a10f-0be8-413a-9bf2-f44bc568d1e4",
  "UserId": "986b1d1b-d0b4-4ee6-bb5b-02e58d437abe",
  "ServicePrincipalId": "",
  "Scopes": "Group.Read.All Mail.ReadWrite Mail.Send MailboxSettings.ReadWrite User.Read openid profile email",
  "IdentityProvider": "",
  "ClientAuthMethod": "2",
  "Wids": "62e90394-69f5-4237-9190-012177145e10 b79fbf4d-3ef9-4689-8143-76b194e85509",
  "ATContent": "",
  "ATContentH": "",
  "ATContentP": "",
  "SourceSystem": "",
  "Type": "MicrosoftGraphActivityLogs"
}

Finally, we’ll use the AppAccessContext.UniqueTokenId to retrieve the corresponding AADNonInteractiveUserSignInLogs event and answer the remaining two questions regarding the identity of 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4.

Corresponding sign-in activity

Here is the corresponding sign-in event for the agent that performed the activity:

 {
  "TenantId": "855f09b2-b284-45cb-af48-6d9ee72abb2b",
  "SourceSystem": "Azure AD",
  "TimeGenerated": "2026-05-08T15:28:55.5845975Z",
  "OperationName": "Sign-in activity",
  "OperationVersion": "1.0",
  "Category": "NonInteractiveUserSignInLogs",
  "ResultType": "0",
  "ResultSignature": "SUCCESS",
  "ResultDescription": "",
  "DurationMs": "0",
  "CorrelationId": "432ea15c-55fa-4132-ae78-cfcfb4405a96",
  "ResourceGroup": "Microsoft.aadiam",
  "Identity": "Matt Graeber",
  "Level": "",
  "Location": "US",
  "AADTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "Agent": {
    "agentType": "agenticAppInstance",
    "parentAppId": "beddadf7-4f3b-4e9b-8443-0b0cf777446e",
    "agentSubjectType": "notAgentic"
  },
  "AlternateSignInName": "",
  "AppDisplayName": "Agent001",
  "AppId": "8cd0a10f-0be8-413a-9bf2-f44bc568d1e4",
  "AppliedEventListeners": null,
  "AppOwnerTenantId": "",
  "AuthenticationContextClassReferences": [],
  "AuthenticationDetails": {
    "authenticationStepDateTime": "2026-05-08T11:26:45.5640057-04:00",
    "authenticationMethod": "Previously satisfied",
    "authenticationMethodDetail": "",
    "succeeded": true,
    "authenticationStepResultDetail": "MFA requirement satisfied by claim in the token",
    "authenticationStepRequirement": ""
  },
  "AuthenticationMethodsUsed": "",
  "AuthenticationProcessingDetails": [
    {
      "key": "Legacy TLS (TLS 1.0, 1.1, 3DES)",
      "value": "False"
    },
    {
      "key": "Oauth Scope Info",
      "value": "[\"Group.Read.All\",\"Mail.ReadWrite\",\"Mail.Send\",\"MailboxSettings.ReadWrite\",\"User.Read\",\"openid\",\"profile\",\"email\"]"
    },
    {
      "key": "Is Legacy Store Used",
      "value": "False"
    },
    {
      "key": "Is CAE Token",
      "value": "False"
    }
  ],
  "AuthenticationProtocol": "none",
  "AuthenticationRequirement": "multiFactorAuthentication",
  "AuthenticationRequirementPolicies": {
    "requirementProvider": "user",
    "detail": "Per-user MFA"
  },
  "AuthenticatorAppLocation": "",
  "AutonomousSystemNumber": "14618",
  "ClientAppUsed": "Browser",
  "ClientCredentialType": "federatedIdentityCredential",
  "ConditionalAccessAudiences": [
    "cc15fd57-2c6c-4117-a88c-83b1d56b4bbe",
    "00000002-0000-0ff1-ce00-000000000000",
    "00000003-0000-0ff1-ce00-000000000000",
    "00000002-0000-0000-c000-000000000000"
  ],
  "ConditionalAccessPolicies": [],
  "ConditionalAccessPoliciesV2": null,
  "ConditionalAccessStatus": "notApplied",
  "CreatedDateTime": "2026-05-08T15:26:45.5640057Z",
  "CrossTenantAccessType": "none",
  "DeviceDetail": {
    "deviceId": "",
    "operatingSystem": "MacOs",
    "browser": "",
    "isCompliant": false,
    "isManaged": false
  },
  "FederatedCredentialId": "1a418fdb-5c5e-4f99-b98c-098d13e240ee",
  "GlobalSecureAccessIpAddress": "",
  "HomeTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "HomeTenantName": "",
  "Id": "2ffe7f1b-6ef8-425a-88f0-b6abcf4c5500",
  "IncomingTokenType": "none",
  "IPAddress": "51.3.97.221",
  "IsInteractive": "false",
  "IsRisky": null,
  "IsTenantRestricted": "false",
  "IsThroughGlobalSecureAccess": "false",
  "LocationDetails": {
    "city": "Ashburn",
    "state": "Virginia",
    "countryOrRegion": "US",
    "geoCoordinates": {
      "latitude": 39.043701171875,
      "longitude": -77.47419738769531
    }
  },
  "MfaDetail": "",
  "NetworkLocationDetails": {
    "networkType": "namedNetwork",
    "networkNames": [
      "USA"
    ]
  },
  "OriginalRequestId": "2ffe7f1b-6ef8-425a-88f0-b6abcf4c5500",
  "OriginalTransferMethod": "none",
  "ProcessingTimeInMs": "175",
  "ResourceDisplayName": "Microsoft Graph",
  "ResourceIdentity": "00000003-0000-0000-c000-000000000000",
  "ResourceOwnerTenantId": "f8cdef31-a31e-4b4a-93e4-5f571e91255a",
  "ResourceServicePrincipalId": "4e881284-c6b3-489e-b241-ec8f35c65dd6",
  "ResourceTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "RiskDetail": "none",
  "RiskEventTypes": [],
  "RiskEventTypes_V2": "",
  "RiskLevelAggregated": "none",
  "RiskLevelDuringSignIn": "none",
  "RiskState": "none",
  "ServicePrincipalId": "8cd0a10f-0be8-413a-9bf2-f44bc568d1e4",
  "SessionId": "003066ba-089b-fe8a-f68e-78764ba250c4",
  "SessionLifetimePolicies": [],
  "SignInEventTypes": ["nonInteractiveUser"],
  "SignInIdentifierType": "",
  "TokenProtectionStatusDetails": {
    "signInSessionStatus": "none",
    "signInSessionStatusCode": 1002
  },
  "Status": {
    "errorCode": 0,
    "additionalDetails": "MFA requirement satisfied by claim in the token"
  },
  "TokenIssuerName": "",
  "TokenIssuerType": "AzureAD",
  "UniqueTokenIdentifier": "G3_-L_huWkKI8Larz0xVAA",
  "UserAgent": "Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1",
  "UserDisplayName": "Matt Graeber",
  "UserId": "986b1d1b-d0b4-4ee6-bb5b-02e58d437abe",
  "UserPrincipalName": "matt@ContosoCorp.onmicrosoft.com",
  "UserType": "Member",
  "Type": "AADNonInteractiveUserSignInLogs"
}

This sign-in event can be summarized as follows:

At 2026-05-08 15:26:45Z, within Entra ID tenant ID adcb5820-70a1-4272-b79c-32f2bba44ddc, agent identity Agent001 (ID: 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4) received a token on behalf of matt@ContosoCorp.onmicrosoft.com with the following Microsoft Graph scopes: Group.Read.All Mail.ReadWrite Mail.Send MailboxSettings.ReadWrite User.Read openid profile email. The sign-in originated from IP address 51.3.97.221 and used the following user-agent: Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1

Now, if you’re familiar with non-interactive sign-in logs, you may be wondering how that leap was made to claim that 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4 was acting on behalf of matt@ContosoCorp.onmicrosoft.com. I was able to make that inference based on the Agent.agentType being set to agenticAppInstance and Agent.agentSubjectType being set to notAgentic. This indicates that an OBO flow occurred.

You may still be wondering though how I could make such a leap. This is why it is important to replicate each authentication type and observe how the generated logs are distinct from one another. The reference section below will spell out clearly how to discern the different agentic authentication flows. Microsoft doesn’t supply an explicit means of identifying the authentication flow so instead we are left to infer.

Storytime

With all the relevant data correlated (Exchange log, Graph API log, and non-interactive sign-in log), we can now produce an event summary that contains all the components necessary to articulate a minimum viable story. The original event summary can now be amended to more accurately reflect the activity as follows:

At 2026-05-08T15:27:05Z, within Entra ID tenant ID adcb5820-70a1-4272-b79c-32f2bba44ddc, the agent identity Agent001 (ID: 8cd0a10f-0be8-413a-9bf2-f44bc568d1e4) sent an email on behalf of matt@ContosoCorp.onmicrosoft.com using the Microsoft Graph beta API to bigwig_CFO@importantcompany.com with a subject line of “Here is your invoice”. The email originated from IP address 51.3.97.221 using the following user-agent string: Mozilla/5.0 (Macintosh; macOS 26.4.1; en-US) PowerShell/7.6.1

With proper event correlation in place, detection improves, enabling a more accurate and timely response.

Reference: Discerning agent authentication flows via sign-in logs

When building detections, performing threat hunting, and responding to incidents, it is important to be able to discern the type of identity and authentication flow that took place. For example, behaviors surrounding autonomous agent activity are expected to be distinct from agent user activity. Likewise, interactive human user behavior will certainly be distinct from agent activity in general.

Now that all three agent authentication scenarios have been covered in this blog post series, it would be helpful to succinctly highlight how to determine the corresponding authentication type based on specific sign-in logs attributes.

1. Autonomous agent sign-in

A sign-in event corresponds to an autonomous agent sign-in under the following conditions:

  1. Sign-in event table: AADServicePrincipalSignInLogs
  2. Agent.agentType == agenticAppInstance

Under these conditions, the identity type will be an agent identity (as opposed to a service principal or managed identity). The key fields that describe the agent identity are as follows:

Field descriptionField name
Agent Identity NameServicePrincipalName
Agent Identity Object IDServicePrincipalId
Agent Identity Parent Blueprint IDAgent.parentAppId

2. Agent’s user account impersonation

A sign-in event corresponds to an agent’s user sign-in under the following conditions:

  1. Sign-in event table: AADNonInteractiveUserSignInLogs
  2. Agent.agentType == agenticAppInstance AND Agent.agentSubjectType == agentIDuser
  3. Optional confirmation: AppId == ServicePrincipalId

Under these conditions, the identity type will be an agent user (as opposed to a standard user identity). The key fields that describe the agent identity are as follows:

Field descriptionField name
Agent User NameUserPrincipalName
Agent User Object IDUserId
Parent Agent Identity Object IDAgent.agentSubjectParentId
Agent Identity Parent Blueprint IDAgent.parentAppId

3) Assistive agent on-behalf-of flow

A sign-in event corresponds to an assistive agent (aka on-behalf-of flow) sign-in under the following conditions:

  1. Sign-in event table: AADNonInteractiveUserSignInLogs
  2. Agent.agentType == agenticAppInstance AND Agent.agentSubjectType == notAgentic
  3. Optional confirmation: AppId == ServicePrincipalId

Under these conditions, the identity type will be an agent identity acting on behalf of a human user identity. The key fields that describe the agent identity are as follows:

Field descriptionField name
Agent User NameAppDisplayName
Agent User Object IDAppId
Human User NameUserPrincipalName
Human User Object IDUserId
Agent Identity Parent Blueprint IDAgent.parentAppId

Conclusion

If you’ve made it this far through this series of posts, congratulations. With Entra Agent ID, there is no shortage of new and expanded concepts that you need to understand if you are to make sense of how to detect and investigate agentic activity. As AI agents continue to explode in adoption, defenders have little choice but to learn how to detect, articulate what happened, and remediate suspicious and malicious agentic behaviors. But regardless of the identity type employed (agentic, user, workload), what remains key is identifying what logs are necessary to tell a minimum viable story as well as the means by which correlation to other data sources is possible. You can’t tell a complete story without the right data, properly correlated.

We hope that these posts have been a helpful foundation and reference for investigating Entra Agent ID activity. Expect more posts in the future that will build upon this foundation.

Appendix: Auditing interactive agent consent grants

In order to grant an agent identity the ability to act on behalf of a user identity, the user needs to first consent to the access_agent scope of the corresponding agent blueprint. When investigating an incident or in just trying to understand what agents users are consenting to in your environment, it will be helpful to pull audit logs for the granted consent. The log you’ll want to target is the ​​Add delegated permission grant operation in the AuditLogs table. Here is the corresponding event generated for the consent granted highlighted at the beginning of this post:

{
  "TenantId": "855f09b2-b284-45cb-af48-6d9ee72abb2b",
  "SourceSystem": "Azure AD",
  "TimeGenerated": "2026-05-08T15:06:23.4442014Z",
  "ResourceId": "/tenants/adcb5820-70a1-4272-b79c-32f2bba44ddc/providers/Microsoft.aadiam",
  "OperationName": "Add delegated permission grant",
  "OperationVersion": "1.0",
  "Category": "ApplicationManagement",
  "ResultType": "",
  "ResultSignature": "None",
  "ResultDescription": "",
  "DurationMs": "0",
  "CorrelationId": "896d9798-09a4-4fb2-ad69-e51456887721",
  "Resource": "Microsoft.aadiam",
  "ResourceGroup": "Microsoft.aadiam",
  "ResourceProvider": "",
  "Identity": "Azure ESTS Service",
  "Level": "",
  "Location": "",
  "AdditionalDetails": [
    {
      "key": "User-Agent",
      "value": "EvoSTS"
    },
    {
      "key": "AppId",
      "value": "beddadf7-4f3b-4e9b-8443-0b0cf777446e"
    },
    {
      "key": "ServicePrincipalProvisioningType",
      "value": "Other"
    }
  ],
  "Id": "Directory_896d9798-09a4-4fb2-ad69-e51456887721_0S5SC_4388216",
  "InitiatedBy": {
    "user": {
      "displayName": "Azure ESTS Service",
      "agentType": "notAgentic",
      "id": "986b1d1b-d0b4-4ee6-bb5b-02e58d437abe",
      "userPrincipalName": "matt@ContosoCorp.onmicrosoft.com",
      "ipAddress": "20.106.103.146",
      "roles": []
    }
  },
  "LoggedByService": "Core Directory",
  "Result": "success",
  "ResultReason": "",
  "TargetResources": [
    {
      "id": "96529a00-a78b-41d9-bcbe-2d9288cb76e1",
      "displayName": "Dev Agent Identity Blueprint - NOT FOR PROD",
      "type": "ServicePrincipal",
      "modifiedProperties": [
        {
          "displayName": "DelegatedPermissionGrant.Scope",
          "oldValue": null,
          "newValue": " access_agent"
        },
        {
          "displayName": "DelegatedPermissionGrant.ConsentType",
          "oldValue": null,
          "newValue": "AllPrincipals"
        },
        {
          "displayName": "ServicePrincipal.ObjectID",
          "oldValue": null,
          "newValue": "97c1b9e9-9640-40b0-9034-bed04e92fdd8"
        },
        {
          "displayName": "ServicePrincipal.DisplayName",
          "oldValue": null,
          "newValue": null
        },
        {
          "displayName": "ServicePrincipal.AppId",
          "oldValue": null,
          "newValue": null
        },
        {
          "displayName": "ServicePrincipal.Name",
          "oldValue": null,
          "newValue": null
        },
        {
          "displayName": "TargetId.ServicePrincipalNames",
          "oldValue": null,
          "newValue": "api://beddadf7-4f3b-4e9b-8443-0b0cf777446e;beddadf7-4f3b-4e9b-8443-0b0cf777446e"
        }
      ],
      "administrativeUnits": [],
      "agentType": "notAgentic"
    },
    {
      "id": "97c1b9e9-9640-40b0-9034-bed04e92fdd8",
      "displayName": null,
      "type": "ServicePrincipal",
      "modifiedProperties": [],
      "administrativeUnits": [],
      "agentType": "notAgentic"
    }
  ],
  "AADTenantId": "adcb5820-70a1-4272-b79c-32f2bba44ddc",
  "ActivityDisplayName": "Add delegated permission grant",
  "ActivityDateTime": "2026-05-08T15:06:23.4442014Z",
  "AADOperationType": "Assign",
  "Type": "AuditLogs"
}

The event is summarized as follows:

At 2026-05-08 15:06:23Z, within Entra ID tenant ID adcb5820-70a1-4272-b79c-32f2bba44ddc, matt@ContosoCorp.onmicrosoft.com consented to the access_agent scope of the Dev Agent Identity Blueprint - NOT FOR PROD agent blueprint principal.

You can infer that the target is a blueprint principal based on the fact that the access_agent scope was granted. The only way to 100 percent confirm though is by enriching the service principal object with Graph API.

Related Articles

Subscribe to our blog