//create google instance
        Google.Apis.IdentityToolkit.v3.IdentityToolkitService GetILClient(bool IsService, string AppName)
        {
            Google.Apis.IdentityToolkit.v3.IdentityToolkitService client = null;

            if (IsService)
            {
                //get service client

                string serviceAccountEmail = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                             [Auth.Interfaces.Constants.C_SettingsModuleName]
                                             [Auth.Interfaces.Constants.C_IL_Service_Email.Replace("{AppName}", AppName)].Value;

                string p12FileLocation = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                         [Auth.Interfaces.Constants.C_SettingsModuleName]
                                         [Auth.Interfaces.Constants.C_IL_Service_p12File.Replace("{AppName}", AppName)].Value;

                string oApiName = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                  [Auth.Interfaces.Constants.C_SettingsModuleName]
                                  [Auth.Interfaces.Constants.C_IL_ApiName.Replace("{AppName}", AppName)].Value;

                var certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2
                                      (p12FileLocation,
                                      "notasecret",
                                      System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable);

                Google.Apis.Auth.OAuth2.ServiceAccountCredential credential = new Google.Apis.Auth.OAuth2.ServiceAccountCredential(
                    new Google.Apis.Auth.OAuth2.ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = new[] { "https://www.googleapis.com/auth/identitytoolkit" }
                }.FromCertificate(certificate));

                client =
                    new Google.Apis.IdentityToolkit.v3.IdentityToolkitService(new Google.Apis.Services.BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName       = oApiName,
                });
            }
            else
            {
                //get web client

                string oApiKey = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                 [Auth.Interfaces.Constants.C_SettingsModuleName]
                                 [Auth.Interfaces.Constants.C_IL_ApiKey.Replace("{AppName}", AppName)].Value;

                string oApiName = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                  [Auth.Interfaces.Constants.C_SettingsModuleName]
                                  [Auth.Interfaces.Constants.C_IL_ApiName.Replace("{AppName}", AppName)].Value;

                client =
                    new Google.Apis.IdentityToolkit.v3.IdentityToolkitService(new Google.Apis.Services.BaseClientService.Initializer()
                {
                    ApiKey          = oApiKey,
                    ApplicationName = oApiName,
                });
            }

            return(client);
        }
        public virtual ActionResult oauth2callback()
        {
            //get current application name
            string oAppName = base.GetAppNameByDomain(base.ReturnUrl);

            ViewBag.AppName = oAppName;

            //get Cookie name
            string oCookieName = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                                 [Auth.Interfaces.Constants.C_SettingsModuleName]
                                 [Auth.Interfaces.Constants.C_IL_Cookie.Replace("{AppName}", oAppName)].Value;

            //get callback url
            string oCallbackUrl = Url.Action(MVC.InternalLogin.ActionNames.oauth2callback, MVC.InternalLogin.Name);

            ViewBag.CallbackUrl = oCallbackUrl;

            //validate user login
            if (Request.Cookies.AllKeys.Any(x => x == oCookieName) &&
                oCallbackUrl == Request.Url.PathAndQuery)
            {
                //get service client
                Google.Apis.IdentityToolkit.v3.IdentityToolkitService service = GetILClient(false, oAppName);

                //validate client login
                Google.Apis.IdentityToolkit.v3.Data.IdentitytoolkitRelyingpartyGetAccountInfoRequest oRequestData =
                    new Google.Apis.IdentityToolkit.v3.Data.IdentitytoolkitRelyingpartyGetAccountInfoRequest()
                {
                    IdToken = Request.Cookies[oCookieName].Value,
                };

                Google.Apis.IdentityToolkit.v3.RelyingpartyResource.GetAccountInfoRequest oRequest = service.Relyingparty.GetAccountInfo(oRequestData);

                Google.Apis.IdentityToolkit.v3.Data.GetAccountInfoResponse oResponse = oRequest.Execute();

                if (oResponse != null && oResponse.Users != null && oResponse.Users.Count > 0)
                {
                    //user is logged in

                    //create model login
                    SessionManager.Models.Auth.User UserToLogin = new SessionManager.Models.Auth.User()
                    {
                        Name     = oResponse.Users[0].DisplayName,
                        LastName = "",
                        Email    = oResponse.Users[0].Email,

                        RelatedUserProvider = new List <SessionManager.Models.Auth.UserProvider>()
                        {
                            new SessionManager.Models.Auth.UserProvider()
                            {
                                ProviderId = (oResponse.Users[0].ProviderUserInfo != null &&
                                              oResponse.Users[0].ProviderUserInfo.Any(x => !string.IsNullOrEmpty(x.FederatedId))) ?
                                             oResponse.Users[0].ProviderUserInfo.Where(x => !string.IsNullOrEmpty(x.FederatedId)).
                                             Select(x => x.FederatedId).DefaultIfEmpty(oResponse.Users[0].LocalId).FirstOrDefault() :
                                             oResponse.Users[0].LocalId,
                                Provider    = SessionManager.Models.Auth.enumProvider.InternalLogin,
                                ProviderUrl = null,
                            }
                        },

                        RelatedUserInfo = new List <SessionManager.Models.Auth.UserInfo>()
                        {
                            new SessionManager.Models.Auth.UserInfo()
                            {
                                UserInfoType = SessionManager.Models.Auth.enumUserInfoType.ProfileImage,
                                Value        = oResponse.Users[0].PhotoUrl,
                            },
                        },
                    };

                    //login user
                    UserToLogin = base.LoginUser(UserToLogin);

                    //Add Log
                    LogManager.ClientLog.AddLog(new LogManager.Models.LogModel()
                    {
                        User        = UserToLogin.UserPublicId,
                        Application = Auth.Interfaces.Constants.C_ApplicationName,
                        Source      = Request.Url.ToString(),
                        IsSuccess   = true,
                        LogObject   = UserToLogin,
                    });

                    //return to site
                    Response.Redirect(base.ReturnUrl.ToString());
                }
            }

            return(View());
        }
        public virtual JsonResult oobActionUrl()
        {
            //get current application name
            string oAppName = base.GetAppNameByDomain(base.ReturnUrl);

            ViewBag.AppName = oAppName;

            //validate reset password
            if (!string.IsNullOrEmpty(Request["action"]) &&
                Request["action"].Trim().ToLower() == "resetpassword")
            {
                //get service client
                Google.Apis.IdentityToolkit.v3.IdentityToolkitService service = GetILClient(true, oAppName);

                //get reset password url
                Google.Apis.IdentityToolkit.v3.Data.Relyingparty oRequestData =
                    new Google.Apis.IdentityToolkit.v3.Data.Relyingparty()
                {
                    Kind        = "identitytoolkit#relyingparty",
                    RequestType = "PASSWORD_RESET",
                    Email       = Request["email"],
                    Challenge   = Request["challenge"],
                    CaptchaResp = Request["response"],
                    UserIp      = Request.UserHostAddress,
                };

                Google.Apis.IdentityToolkit.v3.RelyingpartyResource.GetOobConfirmationCodeRequest oRequest =
                    service.Relyingparty.GetOobConfirmationCode(oRequestData);

                Google.Apis.IdentityToolkit.v3.Data.GetOobConfirmationCodeResponse oResponse = oRequest.Execute();

                //email to regenerate psw
                string oUrlRegeneratePsw = Request.Url.ToString().Replace(Request.Url.PathAndQuery, string.Empty) +
                                           Url.Action
                                               (MVC.InternalLogin.ActionNames.oauth2callback,
                                               MVC.InternalLogin.Name,
                                               new
                {
                    mode    = "resetPassword",
                    oobCode = oResponse.OobCode,
                });

                //Send regenerate psw email
                MessageModule.Client.Controller.ClientController.CreateMessage
                    (new MessageModule.Client.Models.ClientMessageModel()
                {
                    Agent = SettingsManager.SettingsController.SettingsInstance.ModulesParams
                            [Auth.Interfaces.Constants.C_SettingsModuleName]
                            [Auth.Interfaces.Constants.C_IL_RememberEmailAgent.Replace("{AppName}", oAppName)].Value,
                    User             = "******",
                    ProgramTime      = DateTime.Now,
                    MessageQueueInfo = new System.Collections.Generic.List <Tuple <string, string> >()
                    {
                        new Tuple <string, string>("To", Request["email"]),
                        new Tuple <string, string>("RememberUrl", oUrlRegeneratePsw),
                    },
                });


                //return success service
                return(Json(new { success = true, kind = "identitytoolkit#GetOobConfirmationCodeResponse", oobCode = oResponse.OobCode, email = Request["email"] }));
            }
            //return unsuccess service
            return(Json(new { success = false, kind = string.Empty, oobCode = string.Empty, email = Request["email"] }));
        }