diff --git a/src/Open.IdentityServer/src/Endpoints/Results/ConsentPageResult.cs b/src/Open.IdentityServer/src/Endpoints/Results/ConsentPageResult.cs
index 0b4ca0f8e..99a39dd67 100644
--- a/src/Open.IdentityServer/src/Endpoints/Results/ConsentPageResult.cs
+++ b/src/Open.IdentityServer/src/Endpoints/Results/ConsentPageResult.cs
@@ -39,15 +39,8 @@ internal ConsentPageResult(
public override async Task ExecuteAsync(HttpContext context)
{
Init(context);
- var returnUrl = await BuildReturnUrl(context);
-
var consentUrl = Options.UserInteraction.ConsentUrl;
- if (!consentUrl.IsLocalUrl())
- {
- // this converts the relative redirect path to an absolute one if we're
- // redirecting to a different server
- returnUrl = context.GetIdentityServerHost().EnsureTrailingSlash() + returnUrl.RemoveLeadingSlash();
- }
+ var returnUrl = await BuildReturnUrl(context, consentUrl.IsLocalUrl());
var url = consentUrl.AddQueryString(Options.UserInteraction.ConsentReturnUrlParameter, returnUrl);
context.Response.RedirectToAbsoluteUrl(url);
diff --git a/src/Open.IdentityServer/src/Endpoints/Results/CustomRedirectResult.cs b/src/Open.IdentityServer/src/Endpoints/Results/CustomRedirectResult.cs
index 62202e1d7..7d03781e5 100644
--- a/src/Open.IdentityServer/src/Endpoints/Results/CustomRedirectResult.cs
+++ b/src/Open.IdentityServer/src/Endpoints/Results/CustomRedirectResult.cs
@@ -55,14 +55,7 @@ internal CustomRedirectResult(
public override async Task ExecuteAsync(HttpContext context)
{
Init(context);
- var returnUrl = await BuildReturnUrl(context);
-
- if (!_url.IsLocalUrl())
- {
- // this converts the relative redirect path to an absolute one if we're
- // redirecting to a different server
- returnUrl = context.GetIdentityServerHost().EnsureTrailingSlash() + returnUrl.RemoveLeadingSlash();
- }
+ var returnUrl = await BuildReturnUrl(context, _url.IsLocalUrl());
var url = _url.AddQueryString(Options.UserInteraction.CustomRedirectReturnUrlParameter, returnUrl);
context.Response.RedirectToAbsoluteUrl(url);
diff --git a/src/Open.IdentityServer/src/Endpoints/Results/LoginPageResult.cs b/src/Open.IdentityServer/src/Endpoints/Results/LoginPageResult.cs
index adafd288f..62b6e30ee 100644
--- a/src/Open.IdentityServer/src/Endpoints/Results/LoginPageResult.cs
+++ b/src/Open.IdentityServer/src/Endpoints/Results/LoginPageResult.cs
@@ -39,15 +39,8 @@ internal LoginPageResult(
public override async Task ExecuteAsync(HttpContext context)
{
Init(context);
- var returnUrl = await BuildReturnUrl(context);
-
var loginUrl = Options.UserInteraction.LoginUrl;
- if (!loginUrl.IsLocalUrl())
- {
- // this converts the relative redirect path to an absolute one if we're
- // redirecting to a different server
- returnUrl = context.GetIdentityServerHost().EnsureTrailingSlash() + returnUrl.RemoveLeadingSlash();
- }
+ var returnUrl = await BuildReturnUrl(context, loginUrl.IsLocalUrl());
var url = loginUrl.AddQueryString(Options.UserInteraction.LoginReturnUrlParameter, returnUrl);
context.Response.RedirectToAbsoluteUrl(url);
diff --git a/src/Open.IdentityServer/src/Endpoints/Results/ReturnUrlResult.cs b/src/Open.IdentityServer/src/Endpoints/Results/ReturnUrlResult.cs
index 6869e189b..308b11d59 100644
--- a/src/Open.IdentityServer/src/Endpoints/Results/ReturnUrlResult.cs
+++ b/src/Open.IdentityServer/src/Endpoints/Results/ReturnUrlResult.cs
@@ -67,8 +67,9 @@ protected void Init(HttpContext context)
/// Builds a returnUrl using if registered, and fallback
///
/// The HTTP context.
+ /// Indicates whether the return URL should be local.
/// built return url
- protected async Task BuildReturnUrl(HttpContext context)
+ protected async Task BuildReturnUrl(HttpContext context, bool localUrl)
{
var returnUrl = context.GetIdentityServerBasePath().EnsureTrailingSlash() + Constants.ProtocolRoutePaths.AuthorizeCallback;
if (AuthorizationParametersMessageStore != null)
@@ -82,6 +83,13 @@ protected async Task BuildReturnUrl(HttpContext context)
returnUrl = returnUrl.AddQueryString(Request.Raw.ToQueryString());
}
+ if (!localUrl)
+ {
+ // this converts the relative redirect path to an absolute one if we're
+ // redirecting to a different server
+ returnUrl = context.GetIdentityServerHost().EnsureTrailingSlash() + returnUrl.RemoveLeadingSlash();
+ }
+
return returnUrl;
}