///  <summary>
 ///  Configure google sign-in
 ///  </summary>
 ///  <param name="app"></param>
 ///  <param name="clientId"></param>
 ///  <param name="clientSecret"></param>
 /// <param name="caption"></param>
 /// <param name="style"></param>
 /// <param name="icon"></param>
 /// <remarks>
 ///  
 ///  Nuget installation:
 ///      Microsoft.Owin.Security.Google
 /// 
 ///  Google account documentation for ASP.Net Identity can be found:
 ///  
 ///  http://www.asp.net/web-api/overview/security/external-authentication-services#GOOGLE
 ///  
 ///  Google apps can be created here:
 ///  
 ///  https://developers.google.com/accounts/docs/OpenIDConnect#getcredentials
 ///  
 ///  </remarks>
 public static void ConfigureBackOfficeGoogleAuth(this IAppBuilder app, string clientId, string clientSecret,
     string caption = "Google", string style = "btn-google-plus", string icon = "fa-google-plus")
 {
     var googleOptions = new GoogleOAuth2AuthenticationOptions
     {
         ClientId = clientId,
         ClientSecret = clientSecret,
         //In order to allow using different google providers on the front-end vs the back office,
         // these settings are very important to make them distinguished from one another.
         SignInAsAuthenticationType = Constants.Security.BackOfficeExternalAuthenticationType,
         //  By default this is '/signin-google', you will need to change that default value in your
         //  Google developer settings for your web-app in the "REDIRECT URIS" setting
         CallbackPath = new PathString("/umbraco-google-signin")
     };
     googleOptions.ForUmbracoBackOffice(style, icon);
     googleOptions.Caption = caption;
     app.UseGoogleAuthentication(googleOptions);
 }
        ///  <summary>
        ///  Configure google sign-in
        ///  </summary>
        ///  <param name="app"></param>
        ///  <param name="clientId"></param>
        ///  <param name="clientSecret"></param>
        /// <param name="caption"></param>
        /// <param name="style"></param>
        /// <param name="icon"></param>
        /// <remarks>
        ///  
        ///  Nuget installation:
        ///      Microsoft.Owin.Security.Google
        /// 
        ///  Google account documentation for ASP.Net Identity can be found:
        ///  
        ///  http://www.asp.net/web-api/overview/security/external-authentication-services#GOOGLE
        ///  
        ///  Google apps can be created here:
        ///  
        ///  https://developers.google.com/accounts/docs/OpenIDConnect#getcredentials
        ///  
        ///  </remarks>
        public static void ConfigureBackOfficeGoogleAuth(this IAppBuilder app, string clientId, string clientSecret,
            string caption = "Google", string style = "btn-google-plus", string icon = "fa-google-plus")
        {
            var googleOptions = new GoogleOAuth2AuthenticationOptions
            {
                ClientId = clientId,
                ClientSecret = clientSecret,
                //In order to allow using different google providers on the front-end vs the back office,
                // these settings are very important to make them distinguished from one another.
                SignInAsAuthenticationType = Constants.Security.BackOfficeExternalAuthenticationType,
                //  By default this is '/signin-google', you will need to change that default value in your
                //  Google developer settings for your web-app in the "REDIRECT URIS" setting
                CallbackPath = new PathString("/umbraco-google-signin"),

                Provider = new GoogleOAuth2AuthenticationProvider
                {
                    OnAuthenticated = context =>
                    {
                        var emailParts = context.Email.Split('@');
                        if (emailParts.Last() == "umbraco.dk" || emailParts.Last() == "umbraco.com")
                            // All good, return as usual
                            return Task.FromResult(0);

                        // Whoa, this one doesn't belong in our backoffice, throw exception, this will return a nulled out Auth Ticket
                        var errorMessage = string.Format("User tried to log in with {0}, which does not end with an accepted domain name.", context.Email);
                        throw new AuthenticationException(errorMessage);
                    }
                }
            };
            googleOptions.ForUmbracoBackOffice(style, icon);
            googleOptions.Caption = caption;

            googleOptions.SetExternalSignInAutoLinkOptions(
                new ExternalSignInAutoLinkOptions(
                    autoLinkExternalAccount: true,
                    defaultUserType: "admin",
                    defaultAllowedSections: new[] { "content", "media", "settings", "developer", "users", "member" }));

            app.UseGoogleAuthentication(googleOptions);
        }