Camp Manager – nie każdy może założyć konto?

We wczesnych wersjach aplikacji, każdy, kto znał adres strony, mógł założyć sobie konto i pooglądać dane. Ba, mógł je poedytować. Czyli mamy dwa problemy do rozwiązania:

  1. nie każdy powinien móc założyć konto
  2. uprawnienia dla użytkowników!

Tutaj zajmę się tym pierwszym.

Założenia:

  • pierwsze i najważniejsze, nie narobić się 🙂. Czyli nie wyrzucam ani nie wywracam do góry nogami istniejącego mechanizmu zakładania użytkownika. Dlatego:
  • dodaję stronę, gdzie użytkownik może wpisać maile, na które można zarejestrować nowego użytkownika
  • wpiąć się w istniejący mechanizm zakładania nowego użytkownika i nie pozwolić mu założyć konta, jeśli jego email nie został wcześniej zarejestrowany. Jest to standardowy mechanizm wygenerowany z szablonem projektu ASP.NET

W pierwszy kroku dodaję nowy model, który mógłby mieć tylko id i email. U mnie ma ciut więcej, a to już z myślą o uprawnieniach:

    public class UserEmailAllow
    {
        public int Id { get; set; }
        public string Email { get; set; }
        public string StartRoles { get; set; }
        public DateTime? DateExpire { get; set; }

        [Required]
        public Organization Organization { get; set; }
    }

I taką klasę dodałem do mojego DbContext.

Kontrolera i widoku nie pokazuję, to zwykły CRUD, czyli skorzystałem z generatora. Jedynie dodałem sprawdzenie przed zapisem:

            if (_db.Users.FirstOrDefault(x => x.Email == userEmailAllowViewModel.Email) != null)
            {
                ModelState.AddModelError("", "Email istnieje w zarejestrowanych użytkownikach");
                return View(userEmailAllowViewModel);
            }

            if (_db.UserEmailAllow.FirstOrDefault(x => x.Email == userEmailAllowViewModel.Email) != null)
            {
                ModelState.AddModelError("", "Email istnieje w oczekujących na rejestrację");
                return View(userEmailAllowViewModel);
            }

Pozostaje nam wpięcie w zakładanie nowego użytkownika. W kontrolerze: AccountController, jest metoda Register. Wystarczy dodać w niej poniższy kawałek kodu, tuż po sprawdzeniu czy model jest poprawny:

            ApplicationDbContext db = new ApplicationDbContext();
            var userAllow = db.UserEmailAllow.FirstOrDefault(x => x.Email == model.Email);
            if (userAllow == null)
            {
                AddErrors(new IdentityResult("Email nie zarejestrowany. Zgłoś się do administratora"));
                return View(model);
            }