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; }