diff --git a/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml b/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml
index ac0b453bdb..dcad153fce 100644
--- a/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml
+++ b/src/Umbraco.Web.UI/Umbraco/Views/AuthorizeUpgrade.cshtml
@@ -51,7 +51,15 @@
- @Html.BareMinimumServerVariables(Url, (string)ViewBag.UmbracoPath)
+ @{
+ var externalLoginUrl = Url.Action("ExternalLogin", "BackOffice", new
+ {
+ area = ViewBag.UmbracoPath,
+ //Custom redirect URL since we don't want to just redirect to the back office since this is for authing upgrades
+ redirectUrl = Url.Action("AuthorizeUpgrade", "BackOffice")
+ });
+ }
+ @Html.BareMinimumServerVariables(Url, externalLoginUrl)
@Html.AngularExternalLoginInfoValues((IEnumerable)ViewBag.ExternalSignInError)
diff --git a/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml b/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
index a0c6bd225e..63a8688301 100644
--- a/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
+++ b/src/Umbraco.Web.UI/umbraco/Views/Default.cshtml
@@ -66,7 +66,7 @@
- @Html.BareMinimumServerVariables(Url, (string)ViewBag.UmbracoPath)
+ @Html.BareMinimumServerVariables(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }))
@Html.AngularExternalLoginInfoValues((IEnumerable)ViewBag.ExternalSignInError)
diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs
index fe60eb647e..0313dd868f 100644
--- a/src/Umbraco.Web/Editors/BackOfficeController.cs
+++ b/src/Umbraco.Web/Editors/BackOfficeController.cs
@@ -63,27 +63,9 @@ namespace Umbraco.Web.Editors
///
public async Task Default()
{
- ViewBag.UmbracoPath = GlobalSettings.UmbracoMvcArea;
-
- //check if there's errors in the TempData, assign to view bag and render the view
- if (TempData["ExternalSignInError"] != null)
- {
- ViewBag.ExternalSignInError = TempData["ExternalSignInError"];
- return View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/Default.cshtml");
- }
-
- //First check if there's external login info, if there's not proceed as normal
- var loginInfo = await OwinContext.Authentication.GetExternalLoginInfoAsync(
- Core.Constants.Security.BackOfficeExternalAuthenticationType);
-
- if (loginInfo == null)
- {
- return View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/Default.cshtml");
- }
-
- //we're just logging in with an external source, not linking accounts
- return await ExternalSignInAsync(loginInfo);
-
+ return await RenderDefaultOrProcessExternalLoginAsync(
+ () => View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/Default.cshtml"),
+ () => View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/Default.cshtml"));
}
///
@@ -92,11 +74,13 @@ namespace Umbraco.Web.Editors
///
///
[HttpGet]
- public ActionResult AuthorizeUpgrade()
+ public async Task AuthorizeUpgrade()
{
- ViewBag.UmbracoPath = GlobalSettings.UmbracoMvcArea;
-
- return View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/AuthorizeUpgrade.cshtml");
+ return await RenderDefaultOrProcessExternalLoginAsync(
+ //The default view to render when there is no external login info or errors
+ () => View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/AuthorizeUpgrade.cshtml"),
+ //The ActionResult to perform if external login is successful
+ () => Redirect("/"));
}
///
@@ -422,11 +406,15 @@ namespace Umbraco.Web.Editors
}
[HttpPost]
- public ActionResult ExternalLogin(string provider)
+ public ActionResult ExternalLogin(string provider, string redirectUrl = null)
{
+ if (redirectUrl == null)
+ {
+ redirectUrl = Url.Action("Default", "BackOffice");
+ }
+
// Request a redirect to the external login provider
- return new ChallengeResult(provider,
- Url.Action("Default", "BackOffice"));
+ return new ChallengeResult(provider, redirectUrl);
}
[UmbracoAuthorize]
@@ -466,9 +454,42 @@ namespace Umbraco.Web.Editors
return RedirectToLocal(Url.Action("Default", "BackOffice"));
}
- private async Task ExternalSignInAsync(ExternalLoginInfo loginInfo)
+ ///
+ /// Used by Default and AuthorizeUpgrade to render as per normal if there's no external login info, otherwise
+ /// process the external login info.
+ ///
+ ///
+ private async Task RenderDefaultOrProcessExternalLoginAsync(Func defaultResponse, Func externalSignInResponse)
+ {
+ if (defaultResponse == null) throw new ArgumentNullException("defaultResponse");
+ if (externalSignInResponse == null) throw new ArgumentNullException("externalSignInResponse");
+
+ ViewBag.UmbracoPath = GlobalSettings.UmbracoMvcArea;
+
+ //check if there's errors in the TempData, assign to view bag and render the view
+ if (TempData["ExternalSignInError"] != null)
+ {
+ ViewBag.ExternalSignInError = TempData["ExternalSignInError"];
+ return defaultResponse();
+ }
+
+ //First check if there's external login info, if there's not proceed as normal
+ var loginInfo = await OwinContext.Authentication.GetExternalLoginInfoAsync(
+ Core.Constants.Security.BackOfficeExternalAuthenticationType);
+
+ if (loginInfo == null)
+ {
+ return defaultResponse();
+ }
+
+ //we're just logging in with an external source, not linking accounts
+ return await ExternalSignInAsync(loginInfo, externalSignInResponse);
+ }
+
+ private async Task ExternalSignInAsync(ExternalLoginInfo loginInfo, Func response)
{
if (loginInfo == null) throw new ArgumentNullException("loginInfo");
+ if (response == null) throw new ArgumentNullException("response");
// Sign in the user with this external login provider if the user already has a login
var user = await UserManager.FindAsync(loginInfo.Login);
@@ -493,8 +514,8 @@ namespace Umbraco.Web.Editors
Response.Cookies[Core.Constants.Security.BackOfficeExternalCookieName].Expires = DateTime.MinValue;
}
}
-
- return View(GlobalSettings.Path.EnsureEndsWith('/') + "Views/Default.cshtml");
+
+ return response();
}
private async Task SignInAsync(BackOfficeIdentityUser user, bool isPersistent)
diff --git a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs
index dbb79443d9..e43cd21a0e 100644
--- a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs
+++ b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs
@@ -19,13 +19,16 @@ namespace Umbraco.Web
///
///
///
- ///
+ ///
+ /// The post url used to sign in with external logins - this can change depending on for what service the external login is service.
+ /// Example: normal back office login or authenticating upgrade login
+ ///
///
///
/// These are the bare minimal server variables that are required for the application to start without being authenticated,
/// we will load the rest of the server vars after the user is authenticated.
///
- public static IHtmlString BareMinimumServerVariables(this HtmlHelper html, UrlHelper uri, string umbracoPath)
+ public static IHtmlString BareMinimumServerVariables(this HtmlHelper html, UrlHelper uri, string externalLoginsUrl)
{
var str = @"