public ActionResult Confirm(string name, string securityCode)
        {
            int id = WebSecurity.GetUserId(name);

            // Pobranie usługobiorcy po identyfikatorze użytkownika (nie wiadomo, czy potwierdzany użytkownik jest usługodawcą, czy usługobiorcą)
            var customer = _customerRepo.GetCustomerByUserId(id);

            // Pobranie usługodawcy po identyfikatorze użytkownika (nie wiadomo, czy potwierdzany użytkownik jest usługodawcą, czy usługobiorcą)
            var provider = _serviceProviderRepo.GetServiceProviderByUserId(id);

            // Jeśli użytkownik nie jest usługodawcą lub usługobiorcą, to jest to błąd.
            if (customer == null && provider == null)
            {
                TempData["Error"] = "Błąd weryfikacji konta!";
                return(RedirectToAction("Index", "Home"));
            }
            else
            {
                string hashDateInDatebase = string.Empty;

                if (customer != null)
                {
                    hashDateInDatebase = Konto.CalculateConfirmationCode(name, customer.Email, customer.RegistrationDate);
                }
                else
                {
                    hashDateInDatebase = Konto.CalculateConfirmationCode(name, provider.Email, provider.RegistrationDate);
                }

                // Jeżeli wyliczony kod zabezpieczający jest taki sam jak kod przesłany, to konto jest potwierdzone.
                if (securityCode.Equals(hashDateInDatebase, StringComparison.InvariantCultureIgnoreCase))
                {
                    if (provider != null)
                    {
                        // Potwierdzenie konta usługodawcy
                        provider.IsConfirmed = true;
                        _serviceProviderRepo.SaveChanges();
                    }
                    else
                    {
                        // Potwierdzenie konta usługobiorcy
                        customer.IsConfirmed = true;
                        _customerRepo.SaveChanges();
                    }

                    TempData["Message"] = "Pomyślnie potwierdzono adres e-mail!";
                }
                else
                {
                    //  Jeżeli wyliczony kod zabezpieczający jest różny od kodu przesłanego to zwracany jest błąd.
                    TempData["Error"] = "Błąd weryfikacji konta!";
                }
            }

            return(RedirectToAction("Index", "Home"));
        }
        public ActionResult Register(RegisterModel model, bool captchaValid)
        {
            if (captchaValid)
            {
                if (ModelState.IsValid)
                {
                    try
                    {
                        // Utworzenie użytkownika przy pomocy mechanizmu SimpleMembership
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                        int      userId           = WebSecurity.GetUserId(model.UserName);
                        DateTime registrationDate = DateTime.Now;

                        try
                        {
                            // Tworzenie usługodawcy.
                            if (model.IsProvider)
                            {
                                // Utworzenie roli Usługodawca, jeśli jeszcze nie istnieje
                                string roleName = ConfigurationManager.AppSettings["ProviderRole"];

                                if (!Roles.RoleExists(roleName))
                                {
                                    Roles.CreateRole(roleName);
                                }

                                // Dodanie użytkownika do roli
                                Roles.AddUserToRole(model.UserName, roleName);

                                // Utworzenie usługodawcy
                                var provider = new ServiceProvider();

                                if (string.IsNullOrEmpty(model.Name))
                                {
                                    provider.Name = model.UserName;
                                }
                                else
                                {
                                    provider.Name = model.Name;
                                }

                                provider.Email            = model.Email;
                                provider.UserId           = userId;
                                provider.ZipCode          = model.ZipCode;
                                provider.City             = model.City;
                                provider.Street           = model.Street;
                                provider.PhoneNumber      = model.PhoneNumber;
                                provider.RegistrationDate = registrationDate;


                                // Zapisanie usługodawcy w bazie danych
                                _serviceProviderRepo.Add(provider);
                                _serviceProviderRepo.SaveChanges();
                            }
                            else
                            {
                                // Tworzenie usługobiorcy

                                // Utworzenie roli Usługobiorca, jeśli jeszcze nie istnieje
                                string roleName = ConfigurationManager.AppSettings["CustomerRole"];

                                if (!Roles.RoleExists(roleName))
                                {
                                    Roles.CreateRole(roleName);
                                }

                                // Dodanie użytkownika do roli
                                Roles.AddUserToRole(model.UserName, roleName);

                                // Utworzenie usługobiorcy
                                var customer = new Customer();
                                customer.LastName         = model.LastName;
                                customer.FirstName        = model.FirstName;
                                customer.Email            = model.Email;
                                customer.UserId           = userId;
                                customer.ZipCode          = model.ZipCode;
                                customer.City             = model.City;
                                customer.Street           = model.Street;
                                customer.RegistrationDate = registrationDate;


                                // Zapisanie usługobiorcy w bazie danych
                                _customerRepo.Add(customer);
                                _customerRepo.SaveChanges();
                            }


                            // Wygenerowanie linku potwierdzającego rejestrację konta w portalu przy użyciu klasy AccountHelper
                            var confirmedUrl = string.Format("http://{0}{1}{2}",
                                                             Request.Url.Host, (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port), Url.RouteUrl(new { controller = "Account", action = "Confirm", name = model.UserName, securityCode = Konto.CalculateConfirmationCode(model.UserName, model.Email, registrationDate) }));

                            // Wygenerowanie treści e-maila, który zostanie wysłany do użytkownika z linkiem potwierdzającym rejestrację
                            var mailContent =
                                string.Format(
                                    "Witaj!\n\nUtworzyłeś nowe konto w serwisie Portal Usług.\nAdres e-mail: {0}\nData utworzenia: {1}\n\nLink potwierdzający założenie konta: {2}",
                                    model.Email, DateTime.Now, confirmedUrl);

                            // Wysłanie e-maila przy użyciu klasy MailHelper
                            Mail.SendEmail(model.Email, model.UserName, "Potwierdzenie konta", mailContent);

                            TempData["Message"] = "Użytkownik został zarejestrowany. Potwierdź swoje konto linkiem w e-mailu.";
                            return(RedirectToAction("Index", "Home"));
                        }
                        catch
                        {
                            // W razie niepowodzenia należy usunąć utworzone konto użytkownika
                            ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(model.UserName);
                            TempData["Error"] = "Cos poszło nie tak!";
                            return(View());
                        }
                    }
                    catch (MembershipCreateUserException e)
                    {
                        ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                    }
                }

                return(View(model));
            }
            else
            {
                ModelState.AddModelError("Captcha", "Wpisany wynik jest niepoprawny.");
                return(View(model));
            }
        }