Как реализовать пользовательский вход с помощью ASP.NET Ядро 3.1?

#c# #entity-framework-core #asp.net-core-3.1

Вопрос:

У меня есть тестовая база данных на моем локальном сервере. В базе данных у меня есть таблица под названием «Korisnici» (англ. Пользователи). Используя EntityFrameworkCore, я сгенерировал классы из базы данных, и вот сгенерирован класс «Korisnici» :

 public partial class Korisnici
{
    public Korisnici()
    {
        BankovniRacuni = new HashSet<BankovniRacuni>();
        Dokumenti = new HashSet<Dokumenti>();
        ObracuniZarada = new HashSet<ObracuniZarada>();
        Poslodavci = new HashSet<Poslodavci>();
        PrihodiPoslodavca = new HashSet<PrihodiPoslodavca>();
        RashodiPoslodavca = new HashSet<RashodiPoslodavca>();
        Takse = new HashSet<Takse>();
        Zaposleni = new HashSet<Zaposleni>();
    }

    public int Id { get; set; }
    public string Ime { get; set; }
    public string Prezime { get; set; }
    [Required]
    [Display(Name = "Korisnicko ime")]
    public string KorisnickoIme { get; set; }
    public string Email { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Lozinka")]
    public string Lozinka { get; set; }
    public int? TipKorisnika { get; set; }

    public virtual TipoviKorisnika TipKorisnikaNavigation { get; set; }
    public virtual ICollection<BankovniRacuni> BankovniRacuni { get; set; }
    public virtual ICollection<Dokumenti> Dokumenti { get; set; }
    public virtual ICollection<ObracuniZarada> ObracuniZarada { get; set; }
    public virtual ICollection<Poslodavci> Poslodavci { get; set; }
    public virtual ICollection<PrihodiPoslodavca> PrihodiPoslodavca { get; set; }
    public virtual ICollection<RashodiPoslodavca> RashodiPoslodavca { get; set; }
    public virtual ICollection<Takse> Takse { get; set; }
    public virtual ICollection<Zaposleni> Zaposleni { get; set; }
}
 

Этот класс используется в качестве модели для одного представления под названием «Index.cshtml».:

 @model Korisnici
<img src="/Content/images/LogoFinal.png" />
<div class="row">
    <div class="col-md-8">
        <section id="loginForm">
            @using (Html.BeginForm("Login", "Account"))
            {
                @Html.AntiForgeryToken()
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group">
                    @Html.LabelFor(m => m.KorisnickoIme, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.KorisnickoIme, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.KorisnickoIme, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Lozinka, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.PasswordFor(m => m.Lozinka, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Lozinka, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Uloguj se" class="btn btn-primary" />
                    </div>
                </div>
            }
        </section>
    </div>
</div>
 

Когда я нажимаю на кнопку «Отправить», вызывается действие входа в систему от контроллера «AccountControler».

 public class AccountController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public IActionResult Login(LoginViewModel model)
    {
        // Acces database and search for account
        var dbContext = new AdministracijaZingDevDBContext();
        var korisnik = dbContext.Korisnici
            .Where(k => k.KorisnickoIme == model.KorisnickoIme)
            .Where(k => k.Lozinka == model.Lozinka)
            .FirstOrDefault();

        if (korisnik != null)
        {
            HttpContext.Session.SetString("UserName" , model.KorisnickoIme);
            

            return RedirectToAction("Index", "Main");
        }

        return RedirectToAction("Index", "Home");
    }
    
}
 

Я вставил данные тестирования в базу данных с одной записью таблицы Korisnici.
Когда я ввожу правильные данные в форму входа в систему, ничего не происходит (пользователь не прошел логин).

Ответ №1:

просто чтобы проверить, вы создали файлы миграции, обновили базу данных и так далее ?

(Это должно быть в комментарии, но мне не хватает репутации)

кроме того, вы не должны создавать новый контекст, а вводить его в конструктор контроллера вашей учетной записи ( или еще лучше … вы должны внедрить репозиторий или лучше использовать единицу работы-дизайн и CQRS-дизайн)

Берегите себя и удачи.

итак, вы вводите ctor tab tab

что дало бы вам

 public AccountController(){}
 

и затем вы добавляете параметр в AccountController-функцию, такую как

 public AccountController(MyContext context){} 
 

щелкните правой кнопкой мыши => быстрые действия и рефакторинг =>> создайте и назначьте свойство MyContext

но вы должны создать по крайней мере repositorypattern и ввести что-то вроде IKorisniciRepository.

Было бы проще, если бы вы разместили свое репо на GitHub, чтобы я мог протестировать его перед написанием.

Попробуй

  public class AccountController : Controller
{
    private readonly AdministracijaZingDevDBContext Context {get;}

    public AccountController (AdministracijaZingDevDBContext context) {Context = context;}

    public IActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public IActionResult Login(LoginViewModel model)
    {
        // Access database and search for account
       
        var korisnik = Context.Korisnici
            .Where(k => k.KorisnickoIme == model.KorisnickoIme)
            .Where(k => k.Lozinka == model.Lozinka)
            .FirstOrDefault();

    if (korisnik != null)
    {
        HttpContext.Session.SetString("UserName" , model.KorisnickoIme);
        

        return RedirectToAction("Index", "Main");
    }

    return RedirectToAction("Index", "Home");
}
 

}