An Azure Logic Apps workflow is an integration identity with a public front door: anyone holding its trigger URL can start it, and anyone who can edit it inherits every credential and managed identity it uses. Logic Apps sits between SaaS systems, Azure services and on-premises data, so a single workflow often holds more reach than the people who built it. This guide goes product-deep on the controls Microsoft documents for both hosting models, Consumption (multitenant) and Standard (single-tenant, running on the App Service platform): Shared Access Signature (SAS) trigger URLs, Microsoft Entra ID authorisation policies, API connections, managed identities, run history exposure, private networking and logging. It is written for cloud security engineers, integration platform owners and reviewers who need to know which setting to change, not just which principle applies. For flows built in Microsoft 365 rather than Azure, see the Power Automate connections security guide.
This is an independent guide from NHI Mgmt Group, based on Microsoft's public documentation as of November 2026. It is not sponsored or reviewed by Microsoft. Product features change, so confirm settings against Microsoft's current documentation.
Key takeaways
- A SAS trigger URL is a bearer credential. The
sigparameter is signed with the logic app's access key; anyone with the URL can call the workflow until the key is regenerated, so treat callback URLs like account keys and prefer Entra ID authorisation or expiring URLs. - Edit rights equal identity rights. Microsoft states that Contributor or workflow edit permission effectively grants the rights of every managed identity assigned to the workflow, so role assignment on the logic app is privileged access management.
- Run history leaks data by default. Inputs and outputs are visible to anyone with read access unless you enable Secure Inputs and Secure Outputs or restrict run history by IP address.
- Consumption and Standard harden differently. Consumption relies on workflow access control settings and authorisation policies; Standard inherits App Service controls such as private endpoints, access restrictions, VNet integration and Defender for App Service.
- Logging is off until you turn it on. Diagnostic settings, Defender coverage and customer-managed keys all require customer action, according to the Microsoft cloud security benchmark baseline for Logic Apps.
How identity and access work in Azure Logic Apps
Three kinds of identity meet in a logic app: the callers who start a workflow, the administrators and developers who manage it through Azure Resource Manager, and the identities the workflow itself uses to reach other services. Each has its own control plane, and confusing them is the root of most Logic Apps exposure.
Inbound callers: SAS, Entra ID and Easy Auth
When you first save a workflow that starts with a request-based trigger such as Request or HTTP Webhook, Logic Apps generates a callable endpoint. The URL carries a SAS made of three query parameters: sp (the permitted HTTP methods), sv (the SAS version) and sig (a SHA256 signature produced with a secret access key that is stored encrypted with the logic app and never exposed). Microsoft's guidance is to distribute these URLs only over HTTPS and to protect them as you would an account key.
| Inbound control | Consumption | Standard | Notes |
|---|---|---|---|
| SAS in callback URL | Default on request triggers | Default on request triggers | Revoked only by regenerating the access key |
| Expiring callback URL | listCallbackUrl with a NotAfter date | Same REST pattern | URL stops working after the stated time |
| Disable SAS | accessControl.triggers.sasAuthenticationPolicy.state set to Disabled (Request trigger only) | Not required: other authentication types can be used without disabling SAS | Re-enabling SAS revives old signatures |
| Microsoft Entra ID OAuth | Authorisation policies at resource level, type AAD or AADPOP | App Service Easy Auth on the Request trigger | OAuth and SAS together on one call returns an error |
| IP restriction | Workflow settings, Access control configuration, IP ranges for triggers | Networking, access restrictions inherited from App Service | Formats x.x.x.x/x or x.x.x.x-x.x.x.x |
| Private inbound | Not available on the multitenant plan | Private endpoint on the logic app | A 403 from outside the network confirms the endpoint works |
Entra ID authorisation policies on Consumption must include the Issuer claim (starting with https://sts.windows.net/ or https://login.microsoftonline.com/) and the Audience claim, and may add Subject, JWT ID and custom claims. Each claim value must be a single string. Authorisation succeeds when every claim in at least one policy matches. The documented limits are 5 policies per logic app, 10 claims per policy and 150 characters per claim value. Policies do not appear in code view, so review them through the Azure Resource Manager GET on the workflow resource.
To force OAuth only, Microsoft documents a trigger condition such as @startsWith(triggerOutputs()?['headers']?['Authorization'], 'Bearer'), or 'PoP' for Proof-of-Possession tokens. Calls that fail the condition show as Skipped in run history rather than failed, which matters for alerting.
Outbound identity: managed identities and connections
Outbound calls authenticate with one of the types the connector supports: Basic, Client certificate, Raw, Active Directory OAuth or Managed identity. Microsoft recommends Entra ID with managed identities wherever possible because there is no credential to store or rotate. Only connectors that support OAuth with Entra ID can use a managed identity. Built-in examples include HTTP, HTTP + Webhook, Azure Functions, Azure App Services and Azure API Management; managed connector examples include Key Vault, Blob Storage, Service Bus, Event Hubs, SQL Server, Azure Resource Manager and Microsoft Sentinel.
For the identity model in depth, see the Azure Managed Identities Security Guide.
Admin roles and privileged access
In Logic Apps, access is managed through Azure RBAC on the control plane (see control PA-7 in the Microsoft baseline), so everything that matters is decided by control plane roles on the logic app, its resource group and its API connections. The built-in roles differ by hosting model.
| Role | Model | What it allows | Risk to watch |
|---|---|---|---|
| Logic App Contributor | Consumption | Manage workflows, not access | Can change workflow logic and therefore use attached identities |
| Logic App Operator | Consumption | Read, enable and disable workflows, no editing | Can still read run history inputs and outputs that are not secured |
| Logic Apps Standard Reader | Standard | Read only, including run history | Same run history exposure as Operator |
| Logic Apps Standard Operator | Standard | Enable, resubmit and disable workflows, create connections | Resubmitting replays payloads; creating connections adds credentials |
| Logic Apps Standard Developer | Standard | Create and edit workflows, connections and settings, no app-wide changes such as VNet integration | Full use of the app's managed identities through edits |
| Logic Apps Standard Contributor | Standard | Full management except access or ownership changes | Equivalent to owning every identity on the app |
| Contributor | Both | Full resource access, cannot assign roles | Often granted broadly at resource group scope |
- Treat editors as privileged users: because the HTTP built-in operation can request a bearer token for any audience with the workflow's managed identity (Microsoft notes tokens are valid for one hour and the platform does not restrict the destination), a developer who can edit a workflow can obtain tokens for anything that identity can reach.
- Separate build from run: give developers Developer or Contributor rights in non-production subscriptions only, and use Operator or Reader in production, with deployment through a pipeline identity.
- Use resource locks: Microsoft recommends Azure resource locks to prevent changes to or deletion of production logic apps.
- Use just-in-time elevation: grant production Contributor through Privileged Identity Management with approval and a short duration rather than as a standing assignment.
Integrations, API tokens and service accounts
Every managed connector connection is an Azure resource of type API connection that stores either a delegated user token, a service principal secret or a managed identity reference. These are non-human identities and deserve the same lifecycle as any service account.
Choosing the connection identity
| Option | When it fits | Trade-off |
|---|---|---|
| System-assigned managed identity | One app, Azure targets that support Entra ID | Tied to the app lifecycle; disabling it deletes its object ID and breaks connections permanently |
| User-assigned managed identity | Several apps share one access profile, or identity must survive redeployment | Shared blast radius; one per operation at runtime |
| Active Directory OAuth (app registration) | Hybrid Standard deployments, which do not support managed identity, or cross-tenant targets | Client secret or certificate to rotate |
| Delegated user connection | SaaS connectors with no service option | Breaks or persists when the user leaves; acts with that user's rights |
| Basic or Raw | Legacy endpoints only | Static secrets; Basic must only travel over HTTPS |
Consumption logic apps can use the system-assigned identity or one user-assigned identity. Standard logic apps have the system-assigned identity enabled by default and can have several user-assigned identities, though an operation uses one at a time. In Standard, each API connection in connections.json has two authentication objects: the first for the internal token store (system-assigned by default) and the second for the target resource. Grant only the second the access it needs.
Secrets and parameters
- Secure parameters: declare workflow parameters as
securestringorsecureobjectso values are not returned after deployment, and source ARM template values from Azure Key Vault through the parameter file. See the Azure Key Vault Security Guide. - Key Vault references: Standard can reference Key Vault secrets and certificates in app settings through the App Service integration, per the Microsoft baseline (DP-6, DP-7, IM-8).
- Audience precision: managed identity calls fail with 400 or 401 when the Audience does not match exactly, including trailing slashes (
https://storage.azure.com/needs one). Teams that "fix" this by widening the audience or switching to a key create risk. - Revocation: to revoke a managed identity's access, remove its role assignment. Disabling the system-assigned identity is a destructive operation that forces you to recreate connections.
Inbound SAS keys and outbound connection secrets both need an owner, an inventory entry and a rotation date. See the API Key Management Guide and the Webhook Secrets Security Guide.
Logging and detection
Run history is retained for 90 days by default on both models (Consumption allows 7 to 365 days). Run history is an operational view, not a security log, and it is exactly the data you may be hiding with Secure Outputs. Security monitoring needs three feeds.
| Source | What it records | Detection use |
|---|---|---|
| Azure Activity Log | Control plane writes: workflow updates, access key regeneration, authorisation policy changes, role assignments, connection creation | Unexpected workflow definition change; new role assignment on a logic app; SAS disabled then re-enabled |
| Resource logs (diagnostic setting, category Workflow runtime diagnostic events) | Trigger and action runs, status, tracked properties | Spikes in trigger calls; runs from new callers; repeated Skipped runs from a failed OAuth condition |
| Entra ID sign-in logs (service principal and managed identity sign-ins) | Token requests by the workflow's identities | Managed identity requesting tokens for an unusual resource audience |
| Defender for App Service (Standard) | Threat detections on the App Service host | Host-level anomalies for Standard apps |
Microsoft notes that resource logs are not fully lossless and can be delayed by tens of minutes, so do not build time-critical controls on them alone. Tracked properties cannot be used on actions with secure inputs or outputs, which forces a choice between observability and confidentiality per action. Route diagnostic settings to a Log Analytics workspace or event hub feeding your SIEM. See the Azure Monitor, Activity Log and Diagnostic Settings Guide.
ATT&CK techniques that map to Logic Apps abuse include T1078.004 Cloud Accounts (a stolen operator or developer account), T1528 Steal Application Access Token (minting tokens through a workflow's identity), T1552.001 Credentials In Files (callback URLs or secrets committed to source control) and T1098.001 Additional Cloud Credentials (new credentials added to an app registration used by a connection).
Metrics that show the controls work
- Trigger authentication coverage: percentage of request-triggered workflows using Entra ID authorisation, private endpoints or expiring URLs rather than a permanent SAS.
- Secret-free connections: percentage of API connections using managed identity.
- Access key age: days since each logic app's primary and secondary keys were last regenerated.
- Secured run data: count of actions handling credentials or personal data without Secure Inputs and Outputs.
- Standing privilege: number of permanent Contributor or Developer assignments on production logic apps.
Hardening baseline
Roll out in this order, testing each phase on a non-production copy of the workflow first.
- Inventory: list every logic app, its hosting model, trigger type, attached identities and API connections, using Azure Resource Graph. Mark which workflows have request triggers reachable from the internet.
- Turn on logging: add a diagnostic setting for Workflow runtime diagnostic events and AllMetrics, and confirm Activity Log export, before changing anything else so you have a baseline.
- Secure run data: enable Secure Inputs and Secure Outputs on every action that handles credentials, tokens or personal data. Downstream actions do not inherit Secure Inputs automatically, so set them too. For break-glass access, restrict run history content to
0.0.0.0-0.0.0.0and lift it only on request. - Fix inbound authentication: for each request trigger, move to Entra ID authorisation policies (Consumption) or Easy Auth (Standard), add the OAuth-only trigger condition, then disable SAS on Consumption. Where callers cannot do OAuth, issue expiring callback URLs and restrict by IP. Test by calling with and without a token; rollback is re-enabling SAS, which restores old signatures.
- Move connections to managed identity: replace Basic, Raw and secret-based OAuth connections connector by connector, assign narrow roles such as Storage Blob Data Contributor at resource scope, then delete the old connection resource.
- Private networking (Standard): add a private endpoint for inbound and VNet integration for outbound on a dedicated undelegated subnet (/26 recommended). Allow outbound 443 and 445 to the backing storage and 20000 to 30000 between workers, and allow managed connector IPs through any firewall. Note that managed API webhook triggers such as Event Grid and Dataverse do not work behind a private endpoint.
- Encryption and TLS: inbound triggers require TLS 1.2 minimum; avoid the legacy
TLS_RSA_*suites Microsoft lists only for compatibility. For Standard, apply customer-managed keys on the runtime storage account if policy requires it. - Lock and govern: apply resource locks, move production roles to PIM, and assign the Logic Apps and App Service built-in Azure Policy definitions surfaced in Defender for Cloud.
Consumption or Standard for sensitive workloads
Choose Standard where you need private inbound endpoints, outbound routing through your own network, customer-managed keys on runtime storage or data residency within one region (Microsoft notes Consumption data is replicated to the paired region). Consumption suits low-sensitivity, internet-facing integrations where Entra ID authorisation policies and IP restrictions are enough, and where the team cannot run App Service networking. Small organisations often get more risk reduction from Secure Outputs and managed identity on Consumption than from a half-configured Standard network.
Common misconfigurations
- Callback URLs in code and tickets: SAS URLs pasted into repositories, wiki pages and third-party webhook settings act as permanent credentials, and they are only revoked by regenerating the key, which breaks every legitimate caller at once.
- Disabling the managed identity to revoke it: this deletes the object ID and breaks connections even after re-enabling; remove role assignments instead.
- Broad roles for the workflow identity: Contributor at subscription scope "so the designer can browse" turns any workflow edit into subscription takeover. Grant browse scope only where needed and narrow data roles at resource scope.
- Including the Authorization header in outputs: setting
IncludeAuthorizationHeadersInOutputsto build the OAuth condition makes caller tokens visible in run history unless outputs are secured. - Operators reading secrets: Logic App Operator and Standard Reader can see unsecured inputs and outputs, so a read-only role becomes a credential-reading role.
- Delegated connections owned by leavers: connections authorised by a personal account keep that user's rights until the token expires or the user is disabled, then fail silently in production.
Framework mapping
| Control area | NIST SP 800-53 Rev 5 | NIST CSF 2.0 | Microsoft cloud security benchmark |
|---|---|---|---|
| Least privilege for editors and identities | AC-6, AC-2 | PR.AA-05 | PA-7 (not supported on data plane), IM-3 |
| Trigger authentication and key rotation | IA-2, IA-5 | PR.AA-05 | IM-1 |
| Private endpoints and IP restriction | SC-7 | PR.PS-01 | NS-1, NS-2 |
| TLS and encryption at rest | SC-8, SC-28, SC-12 | PR.DS-02 | DP-4, DP-5 |
| Logging and review | AU-2, AU-6 | DE.CM-01 | LT-1, LT-4 |
| Configuration baseline and policy | CM-6, CM-7 | PR.PS-01 | AM-2 |
Practitioner checklist
- Inventory every logic app with request triggers and record who holds each callback URL.
- Regenerate access keys on a schedule and after any suspected exposure, using the secondary key to stage the change.
- Replace permanent SAS with Entra ID authorisation, Easy Auth, private endpoints or expiring
NotAfterURLs. - Enable Secure Inputs and Secure Outputs on every action that touches credentials or personal data, including downstream actions.
- Move API connections to managed identity and grant data roles at resource scope only.
- Treat Developer, Contributor and Logic App Contributor on production as privileged roles held through PIM.
- Send Workflow runtime diagnostic events and the Activity Log to your SIEM and alert on definition changes, key regeneration and new role assignments.
- For Standard apps holding sensitive data, add a private endpoint, VNet integration and Defender for App Service.
- Apply resource locks to production logic apps and their API connections.
Standards and references
- Microsoft Learn: Secure access and data for workflows in Azure Logic Apps
- Microsoft Learn: Authenticate access and connections with managed identities in Azure Logic Apps
- Microsoft Learn: Secure traffic between Standard logic apps and virtual networks using private endpoints
- Microsoft Learn: Monitor Logic Apps with Azure Monitor logs
- Microsoft Learn: Limits and configuration reference for Azure Logic Apps
- Microsoft: Azure security baseline for Logic Apps
- NIST: SP 800-53 Rev 5 Security and Privacy Controls
- MITRE ATT&CK: T1528 Steal Application Access Token
Related NHI Mgmt Group resources: Azure Managed Identities Security Guide · Power Automate connections security · Azure Key Vault Security Guide · How to find over-privileged Azure managed identities · Azure Functions Security Guide