Bu yazımızda kayıt sonrasında email onayı için gerekli olan link oluşturma işlemini gerçekleştirip ardından bu link üzerinden email doğrulama işlemini gerçekleştirceğiz.
İlk olarak Program.cs’de bulunan AddIdentity service’i aşağıdaki şekilde düzenlememiz gerekiyor.
builder.Services.AddIdentity<AppUser, AppRole>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Projemizin şuana kadar olan kısmında kullanıcının login olabilmesi için emailini onaylanma işlemine gerek duymaması maksadı ile “SignIn.RequireConfirmedAccount = false” olarak belirmiştik ancak artık email onayı gerçekleştirmeyen kullanıcının giriş yapamamasını istiyoruz bu sebeple bu atamayı “true” olarak değiştiriyoruz. Ayrıca token oluşturma işlemi için gerekli olan AddDefaultTokenProviders() metodunu da ekliyoruz.
Bu aşamadan sonra daha önceden kayıt olmuş kullanıcıların Users tablosunda “EmailConfirmed” sütunları false olduğu için giriş yapamayacaklardır bu kullanıcılar ile giriş yapabilmek için bu alanı true’ya çevirmeniz gerekmektedir.
Şimdi, Register metodumuzun içinde yer alan if (result.Succeeded) koşulumuzu aşağıdaki şekilde düzenleyelim.
if (result.Succeeded)
{
var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var emailConfirmationLink = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, token = token }, Request.Scheme);
ViewBag.SuccessMessage = "Registration succesful. Before try to login, please confirm your email" +
" by clicking on the confirmation link we have emailed you.";
Console.Write(emailConfirmationLink);
//await _signInManager.SignInAsync(user, isPersistent: false);
//return RedirectToAction("Index", "home");
return View();
}
Projenin bir önceki halinden farklı olarak SignIn metodunu ve redirect işlemini yorum satırına çevirdiğimizi göreceksiniz. Email adresinin onaylanması için gerekli olan linki bu aşamada oluşturmuş olduk. Ayıca Console.Write metodu ile oluşturulan linki denemek için konsola yazdırdık. Linkin mail ile gönderilmesi işlemi bir sonraki yazımızda gerçekleştireceğiz. Kayıt işlemi tamamlandıktan sonra kullanıcıya email onayını tamamlaması (email adresine gelen linki tıklaması) için ViewBag ile bir de mesaj döndürdük. Bu mesajı kullanıcının görüntüleyebilmesi için de Register.chtml‘in üst kısmını aşağıdaki şekilde düzenliyoruz.
@model RegisterViewModel
@{
ViewData["Title"] = "Register";
if(@ViewBag.SuccessMessage != null)
{
<div class="alert alert-success" role="alert">
@ViewBag.SuccessMessage
</div>
}
}
Link oluşturma işlemini tamamladık sıra geldi mail onaylama işlemini gerçekleştirecek olan metodumuzu yazmaya, bunun için AccountController içinde ConfirmEmail adında bir metot oluşturup aşağıdaki şekilde düzenliyoruz.
[HttpGet]
public async Task<IActionResult> ConfirmEmail(string userId, string token)
{
if(userId == null || token == null)
{
return RedirectToAction("Index", "Home");
}
var user = await _userManager.FindByIdAsync(userId);
if (user == null)
{
ViewBag.ErrorMessage = "The user id " + userId + " is invalid!";
return View();
}
var result = await _userManager.ConfirmEmailAsync(user, token);
if (result.Succeeded)
{
ViewBag.SuccessMessage = "Thank you for confirming your email! Now you can be login!";
return View();
}
ViewBag.ErrorMessage = "Email cannot be confirmed!";
return View();
}
}
Yukarıda görüldüğü gibi email onay linkini oluştururken kullandığımız parametre isimleriyle aynı isme sahip string tipinde userId ve token adlı iki değişken alan, ConfirmEmail metodumuzu oluşturduk. Bu sayede linkten gelecek olan parametreler otomatik olarak metod parametrelerine map edilmiş oldu. Ayrıca kullanıcının email onaylama işleminin gerçekleşip gerçekleşmediğini dair kullanıcıyı bilgilendirmek maksadı ile ConfirmEmail metodumuza bir de view ekliyor olacağız. Bunun için Views / Account klasörünün altına bir de ConfirmEmail.cshtml dosyasını ekliyor ve aşağıdaki gibi düzenliyoruz.
@{
ViewData["Title"] = "Confirm Email";
if(@ViewBag.SuccessMessage != null)
{
<div class="alert alert-success" role="alert">
@ViewBag.SuccessMessage
</div>
}
if(@ViewBag.ErrorMessage != null)
{
<div class="alert alert-danger" role="alert">
@ViewBag.ErrorMessage
</div>
}
}
Artık projeyi çalıştırıp yeni bir kullanıcı kaydı gerçekleştirdikten sonra konsolda yazacak olan linki ziyaret etmeden bu kullanıcı ile sisteme giriş yapılamayacak. Bu oluşturulan onay linkinin email ile kullanıcıya gönderilme işlemini bir sonraki yazıda ele alıyor olacağız.