HTTP Endpoint Security
Secure Elsa HTTP workflow endpoints in 3.8.0 by separating workflow ingress authorization from Elsa API permissions and Studio access.
HttpEndpoint security in Elsa has two separate layers:
Workflow ingress security for routes handled by the
HttpEndpointactivity, usually under/workflows/*.Elsa API security for routes under
/elsa/api/*, which Studio and automation clients use.
These layers are independent. A public workflow endpoint does not make the Elsa API public, and Elsa API permissions do not secure a workflow endpoint unless the HttpEndpoint itself requires authorization.
How Elsa exposes HttpEndpoint
HttpEndpointIn release/3.8.0, the HTTP module combines the configured HTTP base path with the activity path. By default, the base path is /workflows, so a workflow path such as orders/{id} is exposed as /workflows/orders/{id}.
HttpEndpoint defaults that matter for security:
SupportedMethodsdefaults toGET.Authorizedefaults tofalse, so the endpoint is public unless you turn authorization on.Policyis optional and only applies when the endpoint is authorized.
The route, allowed methods, authorization flag, and optional policy are stored in the generated HTTP bookmark payload. Elsa uses that payload both when starting a workflow from a trigger and when resuming a waiting workflow through the same endpoint.
Public Endpoints
Leave Authorize disabled when the endpoint must be callable anonymously, for example:
public webhooks
callback URLs protected by their own signed token
anonymous form posts that perform their own validation
Public endpoints still need normal HTTP hardening. For HttpEndpoint, the built-in knobs are:
RequestTimeoutRequestSizeLimitFileSizeLimitAllowedFileExtensionsBlockedFileExtensionsAllowedMimeTypes
You should still apply TLS, ingress rate limits, and payload validation in the host application or reverse proxy.
Authenticated Endpoints
Set Authorize to true when the caller must be authenticated before the workflow can start or resume.
With Authorize = true and no policy configured:
Elsa requires an authenticated
HttpContext.User.Any authenticated principal is accepted.
This depends on the host having ASP.NET Core authentication and authorization enabled. If the host omits app.UseAuthentication() or app.UseAuthorization(), the request reaches Elsa as anonymous and the endpoint authorization fails.
Policy-Based Endpoints
Set both Authorize = true and Policy = "YourPolicyName" when the endpoint should use a named ASP.NET Core authorization policy.
Elsa evaluates that policy through IAuthorizationService.AuthorizeAsync(...) and passes the current workflow as the protected resource. This lets you use standard ASP.NET Core policies based on roles, claims, groups, or custom authorization handlers.
Example host policy:
Then configure the HttpEndpoint activity with:
Authorize: enabledPolicy:WorkflowOperators
Actual 3.8.0 Response Behavior
One important release-specific detail: in release/3.8.0, failed HttpEndpoint authorization currently results in 401 Unauthorized from the HTTP workflows middleware, even when the failure comes from a policy check.
That means these cases all surface as 401 at the workflow endpoint:
no authenticated user
an authenticated user that fails the configured policy
If you are troubleshooting a protected endpoint, do not assume 401 means "not logged in" only. It can also mean the named policy rejected the authenticated caller.
Elsa API Permissions Are Separate
Elsa API endpoints use permissions claims, not the HttpEndpoint Authorize flag.
Common examples:
View workflow definitions
read:workflow-definitions
Edit workflow definitions
write:workflow-definitions
Publish or retract definitions
publish:workflow-definitions, retract:workflow-definitions
View workflow instances and journal-backed data
read:workflow-instances
View activity execution summaries
read:activity-execution
Load Studio designer metadata
read:activity-descriptors, read:activity-descriptors-options, read:expression-descriptors, read:storage-drivers, read:variable-descriptors, read:installed-features
Administer workflow runtime
ManageWorkflowRuntime
Full Elsa API access
*
This is why a user can successfully call a protected HttpEndpoint and still fail to use Elsa Studio, or vice versa.
Studio and Operator Troubleshooting
404 Not Found on a workflow route
404 Not Found on a workflow routeCheck the effective URL first. With default HTTP settings, Path = orders/{id} is served from /workflows/orders/{id}, not /orders/{id}.
401 Unauthorized on /workflows/...
401 Unauthorized on /workflows/...In release/3.8.0, this usually means one of:
Authorizeis enabled and the request is anonymousAuthorizeis enabled, aPolicyis configured, and the authenticated user failed that policythe host did not enable ASP.NET Core authentication/authorization middleware
Studio signs in but cannot load definitions, instances, or designer metadata
That is usually an Elsa API permissions problem, not a workflow ingress problem. Inspect the bearer token or API key identity and confirm it contains the required permissions claims for the /elsa/api/* endpoints Studio is calling.
Public webhook works locally but not behind a gateway
Check the reverse proxy or ingress configuration for:
path rewriting
request size limits
TLS termination
forwarded authentication headers
rate limiting rules
Related Guides
Last updated