Skip to content

feat: add RedirectUriPrefix support to OpenIdConnectConfiguration for sub-path deployments#809

Open
IbrahimMNada wants to merge 6 commits into
elsa-workflows:mainfrom
IbrahimMNada:feat-adding-RedirectUriPrefix
Open

feat: add RedirectUriPrefix support to OpenIdConnectConfiguration for sub-path deployments#809
IbrahimMNada wants to merge 6 commits into
elsa-workflows:mainfrom
IbrahimMNada:feat-adding-RedirectUriPrefix

Conversation

@IbrahimMNada
Copy link
Copy Markdown

@IbrahimMNada IbrahimMNada commented May 8, 2026

Purpose

Allow applications using the ElsaLogin OIDC flow to configure a path prefix for the redirect_uri,
enabling correct authentication in sub-path deployments where the IdP enforces a specific redirect_uri format.

Scope

Select one primary concern:

  • Bug fix (behavior change)
  • Refactor (no behavior change)
  • Documentation update
  • Formatting / code cleanup
  • Dependency / build update
  • New feature

If this PR includes multiple unrelated concerns, please split it before requesting review.


This produces https://myapp.com/workflow/signin-oidc instead of https://myapp.com/signin-oidc.
When not set, behaviour is unchanged — defaults to {origin}/signin-oidc.


Verification

Steps:

  1. Deploy or configure the Elsa Studio host behind a reverse proxy or sub-path (e.g., /workflow).
  2. Set Authentication:ElsaLogin:RedirectUriPrefix to /workflow in appsettings.json.
  3. Register https://myapp.com/workflow/signin-oidc as an allowed redirect URI in your IdP
    (e.g., Azure AD, Keycloak).
  4. Navigate to Elsa Studio and trigger the OIDC login flow.

Expected outcome: The authorization request is sent with
redirect_uri=https://myapp.com/workflow/signin-oidc, the IdP accepts it, and the user is
successfully authenticated.


Screenshots / Recordings (if applicable)

N/A — No UI changes. This is a configuration and service-layer change only.


Checklist

  • The PR is focused on a single concern
  • Commit messages follow the recommended convention
  • Tests added or updated (if applicable)
  • Documentation updated (if applicable)
  • No unrelated cleanup included
  • All tests pass

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 8, 2026

Greptile Summary

This PR adds a RedirectUriPrefix property to OpenIdConnectConfiguration so that Elsa Studio OIDC flows work correctly behind a reverse proxy or sub-path deployment (e.g., /workflow). A new StringExtensions helper normalises the prefix and both RedirectToAuthorizationServer and ReceiveAuthorizationCode are updated consistently.

  • RedirectUriPrefix is optional and null-safe; when unset the existing {origin}/signin-oidc behaviour is preserved.
  • An unrelated encoding regression was introduced while stripping the BOM: the HORIZONTAL ELLIPSIS \u2026 (U+2026) on line 136 of OpenIdConnectAuthorizationService.cs was corrupted to the Unicode Replacement Character (U+FFFD), which will garble truncated error log entries.
  • EnsureEndsWith in StringExtensions.cs is defined but never called.

Confidence Score: 4/5

Safe to merge after fixing the corrupted ellipsis character in the error-logging path; the OIDC feature itself is correctly implemented.

The redirect URI construction change is correct and backward-compatible. The one concrete defect is an unintended character corruption on line 136 of OpenIdConnectAuthorizationService.cs — the ellipsis was replaced with the Unicode Replacement Character when the BOM was stripped, meaning every truncated OIDC error log entry will end with a garbled glyph.

src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs — specifically line 136 where the ellipsis character was corrupted.

Important Files Changed

Filename Overview
src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs Adds RedirectUriPrefix support to redirect URI construction; inadvertently corrupts the ellipsis character (U+2026 to U+FFFD) in ReadErrorSummaryAsync line 136 due to BOM removal.
src/modules/Elsa.Studio.Login/Extensions/StringExtensions.cs New helper file adding EnsureStartsWith and EnsureEndsWith string extensions; EnsureEndsWith is currently unused dead code.
src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs Adds nullable RedirectUriPrefix property with clear XML doc comment; no issues.

Sequence Diagram

sequenceDiagram
    participant Browser
    participant ElsaStudio as Elsa Studio (Blazor)
    participant Config as OpenIdConnectConfiguration
    participant IdP as Identity Provider

    Browser->>ElsaStudio: Navigate to protected route
    ElsaStudio->>Config: Read RedirectUriPrefix (e.g. "/workflow")
    ElsaStudio->>ElsaStudio: "Build redirectUri = origin + EnsureStartsWith + /signin-oidc"
    Note over ElsaStudio: e.g. https://myapp.com/workflow/signin-oidc
    ElsaStudio->>IdP: GET /authorize with redirect_uri
    IdP-->>Browser: 302 to redirect_uri with auth code
    Browser->>ElsaStudio: "GET /workflow/signin-oidc?code=AUTH_CODE"
    ElsaStudio->>Config: Read RedirectUriPrefix again
    ElsaStudio->>ElsaStudio: Rebuild same redirectUri for token exchange
    ElsaStudio->>IdP: POST /token with code and redirect_uri
    IdP-->>ElsaStudio: access_token, refresh_token, id_token
    ElsaStudio-->>Browser: NavigateTo returnUrl
Loading
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
src/modules/Elsa.Studio.Login/Extensions/StringExtensions.cs:19-28
`EnsureEndsWith` is defined but never called anywhere in this PR or the existing codebase. Shipping unused internal code creates unnecessary maintenance surface. If it's genuinely needed in a follow-up, it can be added then; otherwise it should be removed.

### Issue 2 of 2
src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs:136
**Corrupted ellipsis character**

The original file (which had a UTF-8 BOM) contained the HORIZONTAL ELLIPSIS `` (U+2026) on this line. When the BOM was stripped in this PR, the multi-byte sequence for that character was corrupted to U+FFFD (the Unicode Replacement Character). At runtime, truncated error summaries logged by `ReadErrorSummaryAsync` will end with the replacement character `<?>` instead of ``, producing garbled log output. Replace the character literal on this line with the correct `` (U+2026), or use the escape `\u2026`.

Reviews (2): Last reviewed commit: "Merge branch 'main' into feat-adding-Red..." | Re-trigger Greptile

Comment thread src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs Outdated
Comment thread src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs
@IbrahimMNada
Copy link
Copy Markdown
Author

@sfmskywalker
please take a look at this PR

@sfmskywalker
Copy link
Copy Markdown
Member

@greptile please review

summary = summary[..MaxLoggedErrorLength];

return truncated ? $"{summary}" : summary;
return truncated ? $"{summary}" : summary;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Corrupted ellipsis character

The original file (which had a UTF-8 BOM) contained the HORIZONTAL ELLIPSIS (U+2026) on this line. When the BOM was stripped in this PR, the multi-byte sequence for that character was corrupted to U+FFFD (the Unicode Replacement Character). At runtime, truncated error summaries logged by ReadErrorSummaryAsync will end with the replacement character <?> instead of , producing garbled log output. Replace the character literal on this line with the correct (U+2026), or use the escape \u2026.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs
Line: 136

Comment:
**Corrupted ellipsis character**

The original file (which had a UTF-8 BOM) contained the HORIZONTAL ELLIPSIS `` (U+2026) on this line. When the BOM was stripped in this PR, the multi-byte sequence for that character was corrupted to U+FFFD (the Unicode Replacement Character). At runtime, truncated error summaries logged by `ReadErrorSummaryAsync` will end with the replacement character `<?>` instead of ``, producing garbled log output. Replace the character literal on this line with the correct `` (U+2026), or use the escape `\u2026`.

How can I resolve this? If you propose a fix, please make it concise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants