Untitled
unknown
plain_text
3 years ago
12 kB
10
Indexable
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using ShoppingApp.Core;
using ShoppingApp.Entity.Concrete.Identity;
using ShoppingApp.Web.EmailServices.Abstract;
using ShoppingApp.Web.Models.Dtos;
namespace ShoppingApp.Web.Controllers
{
[AutoValidateAntiforgeryToken]
public class AccountController : Controller
{
private readonly UserManager<User> _userManager;
private readonly SignInManager<User> _signInManager;
private readonly IEmailSender _emailSender;
public AccountController(UserManager<User> userManager, SignInManager<User> signInManager, IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_emailSender = emailSender;
}
public IActionResult Login(string returnUrl=null)
{
return View(new LoginDto { ReturnUrl=returnUrl});
}
[HttpPost]
public async Task<IActionResult> Login(LoginDto loginDto)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(loginDto.Email);
if (user==null)
{
ModelState.AddModelError("", "Böyle bir kullanıcı bulunamadı!");
return View(loginDto);
}
if (!await _userManager.IsEmailConfirmedAsync(user))
{
TempData["Message"] = Jobs.CreateMessage("Bilgi", "Hesabınız onaylanmamış. Lütfen mailinize gelen onay linkine tıklayarak, hesabınızı onaylayınz.", "warning");
return View(loginDto);
//ÖDEV: Eğer hesap onaylı değilse burada kullanıcıya "Onay linki gönder" şeklinde bir buton gözüksün. Ve bu butona basıldığında tekrar onay maili yollansın.
}
var result = await _signInManager.PasswordSignInAsync(user, loginDto.Password, true, true);
if (result.Succeeded)
{
return Redirect(loginDto.ReturnUrl ?? "~/");
}
ModelState.AddModelError("", "Email adresi ya da parola hatalı!");
}
return View(loginDto);
}
public IActionResult Register()
{
return View();
}
[HttpPost]
//[ValidateAntiForgeryToken]//İlgili cookienin sadece ait olduğu tarayıcı tarafından gönderilmesi halinde geçerli olmasını sağlar.
public async Task<IActionResult> Register(RegisterDto registerDto)
{
if (ModelState.IsValid)
{
var user = new User
{
FirstName = registerDto.FirstName,
LastName = registerDto.LastName,
UserName = registerDto.UserName,
Email = registerDto.Email
};
var result = await _userManager.CreateAsync(user, registerDto.Password);
if (result.Succeeded)
{
//Generate token(mail onayı için)
var tokenCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var url = Url.Action("ConfirmEmail", "Account", new
{
userId = user.Id,
token = tokenCode
});
Console.WriteLine(url);
//Mailin gönderilme, onaylanma vs
await _emailSender.SendEmailAsync(user.Email, "ShoppingApp Hesap Onaylama", $"<h1>Merhaba</h1><br><p>Lütfen hesabınızı onaylamak için aşağıdaki linke tıklayınız.</p><a href='https://localhost:7215{url}'>Onay linki</a>");
TempData["Message"] = Jobs.CreateMessage("Bilgi", "Lütfen mail hesabınızı kontrol edin. Gelen linki tıklayarak, hesabınızı onaylayın.", "warning");
return RedirectToAction("Login","Account");
}
}
ModelState.AddModelError("", "Bilinmeyen bir hata oluştu, lütfen tekrar deneyiniz");
return View(registerDto);
}
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
public async Task<IActionResult> ConfirmEmail(string userId, string token)
{
if (userId==null || token == null)
{
TempData["Message"] = Jobs.CreateMessage("Hata", "Geçersiz token ya da user bilgisi.", "danger");
return View();
}
var user = await _userManager.FindByIdAsync(userId);
if (user != null)
{
var result = await _userManager.ConfirmEmailAsync(user, token);
if (result.Succeeded)
{
TempData["Message"] = Jobs.CreateMessage("Başarılı", "Hesabınız başarıyla onaylandı. Giriş yapabilirsiniz.", "success");
return RedirectToAction("Login","Account");
}
}
TempData["Message"] = Jobs.CreateMessage("Hata", "Bir sorun oluştu ve hesabınız onaylanmadı. Lütfen admin ile iletişime geçiniz.", "danger");
return View();
}
public IActionResult ForgotPassword()
{
return View();
}
[HttpPost]
public async Task<IActionResult> ForgotPassword(string email)
{
if (String.IsNullOrEmpty(email))
{
TempData["Message"] = Jobs.CreateMessage("Hata", "Lütfen mail adresinizi eksiksiz bir şekild giriniz.", "danger");
return View();
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
TempData["Message"] = Jobs.CreateMessage("Hata", "Böyle kayıtlı bir mail adresi bulunamadı. Lütfen kontrol ederek, yeniden deneyiniz.", "danger");
return View();
}
var tokenCode = await _userManager.GeneratePasswordResetTokenAsync(user);
var url = Url.Action("ResetPassword", "Account", new
{
userId = user.Id,
token=tokenCode
});
await _emailSender.SendEmailAsync(
email,
"ShoppingApp Şifre Sıfırlama Linki",
$"Lütfen parolanızı yenilemek için <a href='https://localhost:7215{url}'>tıklayınız.</a>"
);
TempData["Message"] = Jobs.CreateMessage("Bilgi", "Şifre sıfırlama linkiniz, mail adresinize gönderilmiştir. Lütfen mail adresinizi kontrol ediniz.", "info");
return RedirectToAction("Login","Account");
}
public IActionResult ResetPassword(string userId, string token)
{
if (userId==null || token==null)
{
TempData["Message"] = Jobs.CreateMessage("Hata", "Bir sorun oluştu, lütfen daha sonra yeniden deneyiniz.", "danger");
return RedirectToAction("Index", "Home");
}
var resetPasswordDto = new ResetPasswordDto
{
Token = token
};
return View();
}
[HttpPost]
public async Task<IActionResult> ResetPassword(ResetPasswordDto resetPasswordDto)
{
if(!ModelState.IsValid)
{
return View(resetPasswordDto);
}
var user = await _userManager.FindByEmailAsync(resetPasswordDto.Email);
if (user == null)
{
TempData["Message"] = Jobs.CreateMessage("Hata", "Böyle bir kullanıcı bulunamadı. Tekrar deneyiniz", "danger");
return View(resetPasswordDto);
}
var result = await _userManager.ResetPasswordAsync(user,resetPasswordDto.Token,resetPasswordDto.Password);
if (result.Succeeded)
{
TempData["Message"] = Jobs.CreateMessage("Başarılı", "Parolanız başarıyla değiştirilmiştir. Giriş yapmayı deneyebilirsiniz.", "success");
return RedirectToAction("Login", "Account");
}
TempData["Message"] = Jobs.CreateMessage("Hata", "Bir hata oluştu. Lütfen admin ile iletişime geçiniz.", "danger");
return Redirect("~/");
}
public async Task<IActionResult> Manage(string id)
{
var name = id;
if (String.IsNullOrEmpty(name))
{
return NotFound();
}
var user = await _userManager.FindByNameAsync(name);
if(user==null) { return NotFound(); }
List<SelectListItem> genderList = new List<SelectListItem>();
genderList.Add(new SelectListItem
{
Text="Kadın",
Value="Kadın",
Selected=user.Gender=="Kadın" ? true : false
});
genderList.Add(new SelectListItem
{
Text = "Erkek",
Value = "Erkek",
Selected=user.Gender=="Erkek" ? true : false
});
UserManageDto userManageDto = new UserManageDto
{
Id=user.Id,
FirstName = user.FirstName,
LastName = user.LastName,
Gender = user.Gender,
DateOfBirth = user.DateOfBirth,
UserName = user.UserName,
Email = user.Email,
GenderSelectList=genderList
};
return View(userManageDto);
}
[HttpPost]
public async Task <IActionResult> Manage(UserManageDto userManageDto)
{
if (userManageDto == null) { return NotFound(); }
var user = await _userManager.FindByIdAsync(userManageDto.Id);
if (user==null){ return NotFound(); }
user.FirstName = userManageDto.FirstName;
user.LastName = userManageDto.LastName;
user.UserName = userManageDto.UserName;
user.Gender = userManageDto.Gender;
user.Email = userManageDto.Email;
var result = await _userManager.UpdateAsync(user);
if (result.Succeeded)
{
TempData["Message"] = Jobs.CreateMessage("Başarılı!", "Profiliniz başarıyla kaydedilmiştir.", "success");
}
List<SelectListItem> genderList = new List<SelectListItem>();
genderList.Add(new SelectListItem
{
Text = "Kadın",
Value = "Kadın",
Selected = user.Gender == "Kadın" ? true : false
});
genderList.Add(new SelectListItem
{
Text = "Erkek",
Value = "Erkek",
Selected = user.Gender == "Erkek" ? true : false
});
userManageDto.GenderSelectList = genderList;
return View(userManageDto);
//ÖDEV: Eğer kullanıcı adı değiştirilmişse sağ üst köşedeki username bölümünün güncellenmesini JavaScript kodları yazarak sağlayınız.
//Veya "Benim aklmıma başka çözüm geldi" diyen varsa, kabülümüzdür :)
}
public IActionResult AccessDenied()
{
return View();
}
}
}
Editor is loading...