elsa-core/src/apps/Elsa.Server.Web/Activities/AuthorizeFlow.cs
Sipke Schoorstra 7467b6347d
Add support for flow authorization activities and bookmark trigger URL generation (#6828)
* Add support for flow authorization activities and bookmark trigger URL generation

- Introduced `AuthorizeFlow` activity for configurable policy-based flow authorization.
- Added extensions for generating bookmark trigger URLs.
- Created `BookmarkTokenPayload` and updated APIs to handle bookmark resumption with SAS tokens.
- Refactored and consolidated related code for improved modularity and clarity.

* Update src/modules/Elsa.Http/Extensions/BookmarkExpressionExecutionContextExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/modules/Elsa.Http/Extensions/BookmarkExpressionExecutionContextExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/apps/Elsa.Server.Web/Activities/AuthorizeFlow.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-29 20:22:39 +02:00

49 lines
1.7 KiB
C#

using Elsa.Extensions;
using Elsa.Workflows;
using Elsa.Workflows.Activities.Flowchart.Attributes;
using Elsa.Workflows.Attributes;
namespace Elsa.Server.Web.Activities;
[Activity("Elsa", "Authorization", "Authorizes a flow based on the configured policies.")]
[FlowNode("Authorized", "Unauthorized", "Error")]
public class AuthorizeFlow : Activity<string>
{
protected override ValueTask ExecuteAsync(ActivityExecutionContext context)
{
var httpContext = context.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext == null)
throw new InvalidOperationException("HttpContext is not available. Ensure that the activity is executed within an HTTP request context.");
var bookmark = context.CreateBookmark(new AuthorizeStimulus(), OnResumeAsync);
var redirectUrl = context.ExpressionExecutionContext.GenerateBookmarkTriggerUrl(bookmark.Id);
Result.Set(context, redirectUrl);
return ValueTask.CompletedTask;
}
private async ValueTask OnResumeAsync(ActivityExecutionContext context)
{
if (!context.TryGetWorkflowInput<string>("Answer", out var response))
{
await context.CompleteActivityWithOutcomesAsync("Unauthorized");
return;
}
switch (response)
{
case "Authorized":
await context.CompleteActivityWithOutcomesAsync("Authorized");
return;
case "Error":
await context.CompleteActivityWithOutcomesAsync("Error");
return;
default:
await context.CompleteActivityWithOutcomesAsync("Unauthorized");
break;
}
}
}
public record AuthorizeStimulus;