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:
- nie każdy powinien móc założyć konto
- 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);
}