/// <summary>
            /// Finalizes the link to existing customer.
            /// </summary>
            /// <param name="emailAddressOfExistingCustomer">The email address of existing customer.</param>
            /// <param name="activationCode">The activation code.</param>
            /// <returns>The link result.</returns>
            public virtual async Task <LinkToExistingCustomerResult> FinalizeLinkToExistingCustomer(string emailAddressOfExistingCustomer, string activationCode)
            {
                IStoreOperationsManager      storeOperationsManager = Utilities.GetManagerFactory(this.EcommerceContext.GetAnonymousContext()).GetManager <IStoreOperationsManager>();
                LinkToExistingCustomerResult result = await storeOperationsManager.FinalizeLinkToExistingCustomer(emailAddressOfExistingCustomer, activationCode);

                return(result);
            }
            /// <summary>
            /// Initiates a link between an external identity and an existing customer.
            /// </summary>
            /// <param name="emailAddressOfExistingCustomer">The email address of existing customer.</param>
            /// <param name="emailTemplateId">The email template identifier.</param>
            /// <param name="emailTemplateProperties">The email template properties.</param>
            /// <returns>
            /// A task.
            /// </returns>
            public virtual async Task <LinkToExistingCustomerResult> InitiateLinkExternalIdToExistingCustomer(string emailAddressOfExistingCustomer, string emailTemplateId, IEnumerable <NameValuePair> emailTemplateProperties)
            {
                string activationToken = System.Guid.NewGuid().ToString();
                IStoreOperationsManager      storeOperationsManager = Utilities.GetManagerFactory(this.EcommerceContext).GetManager <IStoreOperationsManager>();
                LinkToExistingCustomerResult linkResult             = await storeOperationsManager.InitiateLinkToExistingCustomer(emailAddressOfExistingCustomer, activationToken, emailTemplateId, emailTemplateProperties);

                return(linkResult);
            }
            /// <summary>
            /// Saves the customer account activation request to channel DB.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <LinkToExistingCustomerResult> InitiateLinkToExistingCustomer(InitiateLinkToExistingCustomerDataRequest request)
            {
                CustomerSqlServerDatabaseAccessor databaseAccessor = this.GetSqlDatabaseAccessorInstance(request.RequestContext);
                LinkToExistingCustomerResult      result           = databaseAccessor.InitiateLinkToExistingCustomer(request.EmailAddress, request.ActivationToken, request.ExternalIdentityId, request.ExternalIdentityIssuer, request.CustomerId);

                this.UpdateCustomerExternalIdentityMapCache(request.RequestContext, result.ExternalIdentityId, result.ExternalIdentityProvider);

                return(new SingleEntityDataServiceResponse <LinkToExistingCustomerResult>(result));
            }
Esempio n. 4
0
            public async Task <ActionResult> FinishSignUp()
            {
                IdentityProviderType selectedAuthenticationProviderType;

                Enum.TryParse(this.Request.Form["SelectedAuthenticationProviderType"], out selectedAuthenticationProviderType);

                string           selectedAuthenticationProviderToken = this.Request.Form["SelectedAuthenticationProviderToken"];
                EcommerceContext ecommerceContext = ServiceUtilities.GetEcommerceContext(this.HttpContext, selectedAuthenticationProviderToken, selectedAuthenticationProviderType);

                string signUpRadioButtonSelection = this.Request.Form["SignUpRadioButton"];

                if (string.Equals(signUpRadioButtonSelection, NewAccount, StringComparison.OrdinalIgnoreCase))
                {
                    string firstName = this.Request.Form["FirstName"];
                    string lastName  = this.Request.Form["LastName"];
                    string email     = this.Request.Form["Email"];

                    Customer customer = new Customer();
                    customer.Email         = email;
                    customer.AccountNumber = string.Empty;
                    customer.FirstName     = firstName;
                    customer.LastName      = lastName;

                    CustomerOperationsHandler customerOperationsHandler = new CustomerOperationsHandler(ecommerceContext);
                    customer = await customerOperationsHandler.Create(customer);

                    this.UpdateClaims(
                        this.HttpContext,
                        selectedAuthenticationProviderToken,
                        selectedAuthenticationProviderType,
                        email,
                        customer.AccountNumber,
                        customer.FirstName,
                        customer.LastName);

                    return(this.RedirectToAction(HomeController.DefaultActionName, HomeController.ControllerName));
                }
                else
                {
                    string emailOfExistingCustomer = this.Request.Form["EmailOfExistingCustomer"];
                    LinkToExistingCustomerResult linkToExistingCustomerResult = null;
                    try
                    {
                        CustomerOperationsHandler customerOperationsHandler = new CustomerOperationsHandler(ecommerceContext);
                        linkToExistingCustomerResult = await customerOperationsHandler.InitiateLinkExternalIdToExistingCustomer(emailOfExistingCustomer, "emailTemplateId", null);
                    }
                    catch (DataValidationException ex)
                    {
                        if (string.Equals(ex.ErrorResourceId, DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound.ToString(), StringComparison.OrdinalIgnoreCase))
                        {
                            RetailLogger.Log.OnlineStoreCustomerForLinkingNotFound(Utilities.GetMaskedEmailAddress(emailOfExistingCustomer), ex, ex.InnerException);

                            this.TempData["BadLinkUpEmail"]         = emailOfExistingCustomer;
                            this.TempData["AuthToken"]              = selectedAuthenticationProviderToken;
                            this.TempData["ExternalIdProviderType"] = selectedAuthenticationProviderType;
                            this.TempData["LogOnEmail"]             = this.Request.Form["LogOnEmail"];

                            return(this.RedirectToAction(SignInController.StartSignUpActionName, SignInController.ControllerName));
                        }
                        else
                        {
                            throw ex;
                        }
                    }

                    string maskedEmailAddress = Utilities.GetMaskedEmailAddress(linkToExistingCustomerResult.EmailAddress);

                    ////Clean up auth cookies completely. We need to be signed out.

                    this.TempData["IsSignUpFlow"] = true;
                    this.TempData["MaskedEmail"]  = maskedEmailAddress;

                    return(this.RedirectToAction(SignInController.AccountLinkUpPendingActionName, SignInController.ControllerName));
                }
            }