При входе пользователя на сайт его работа буде начинаться с авторизации, и первое что пользователь увидит - это страница авторизации. А за всю логику авторизации будет отвечать контроллер AccountController. Поэтому добавим в проект в папку Controllers класс AccountController:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Security; using HelpDeskTrain.Models; namespace HelpDeskTrain.Controllers { [AllowAnonymous] public class AccountController : Controller { public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(LogViewModel model, string returnUrl) { if (ModelState.IsValid) { if (ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Request"); } } else { ModelState.AddModelError("", "Неправильный пароль или логин"); } } return View(model); } public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Login", "Account"); } private bool ValidateUser(string login, string password) { bool isValid = false; using (HelpdeskContext _db = new HelpdeskContext()) { try { User user = (from u in _db.Users where u.Login == login && u.Password==password select u).FirstOrDefault(); if (user != null) { isValid = true; } } catch { isValid = false; } } return isValid; } } }
Поскольку обращаться к контроллеру может любой, то для него установим атрибут [AllowAnonymous], который открывает анонимный доступ.
В контроллере определено действие Login, которое авторизует пользователя. GET-вариант метода выдает страницу авторизации. А POST-версия обрабатывает введенные данные и, в зависимости от того, был ли найден в базе данных пользователь с подобными логином и паролем, авторизует его, устанавливая соответствующие куки.
На метод RedirectToAction("Index", "Request");
пока можно не обращать внимания. Чуть позже мы определим контроллер RequestContoller,
на который в данном случае будет идти переадрессация.
Метод Login использует вспомогательный метод ValidateUser, который служит для валидации пользователя. В случае, если бы у нас использовался провайдер членства, то мы бы в нем определили этот метод. А в данном случае мы определяем его в контроллере.
Также, для упрощения работы с данными в методе Login используется модель LogViewModel, которая и будет передавать в контроллер введенные пользователем данные. Добавим класс этой модели в папку Models:
using System.ComponentModel.DataAnnotations; namespace HelpDeskTrain.Models { public class LogViewModel { [Required] [Display(Name = "Логин")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Пароль")] public string Password { get; set; } [Required] [Display(Name = "Запомнить?")] public bool RememberMe { get; set; } } }
Cкомпилируем проект с помощью функции Build, чтобы нам стали доступными все созданные модели.
Теперь добавим в проект первое представление, которое будет предназначено для авторизации. Это будет строго типизированное представление - типизировано оно будет моделью LogViewModel. Итак, добавим в проект представление Login:
Для облегчения работы используем в настройках шаблон Create, который нам создаст шаблонное представление. А мастер-страница layout в данном случае использоваться не будет.
Немного изменим стандартное представление следующим образом:
@model HelpDeskTrain.Models.LogViewModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <link href="~/Content/Site.css" rel="stylesheet" type="text/css" /> <title>Вход в систему</title> </head> <body> <script src="~/Scripts/jquery-1.7.1.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> <h2>Вход в систему</h2> <p>Введите свой логин и пароль для входа в систему</p> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Войти в систему</legend> <div class="editor-label"> @Html.LabelFor(model => model.UserName) </div> <div class="editor-field"> @Html.EditorFor(model => model.UserName) @Html.ValidationMessageFor(model => model.UserName) </div> <div class="editor-label"> @Html.LabelFor(model => model.Password) </div> <div class="editor-field"> @Html.EditorFor(model => model.Password) @Html.ValidationMessageFor(model => model.Password) </div> <div class="editor-label"> @Html.LabelFor(model => model.RememberMe) </div> <div class="editor-field"> @Html.EditorFor(model => model.RememberMe) </div> <p> <input type="submit" value="Войти" /> </p> </fieldset> } </body> </html>
И в конце мы можем протестировать представление, запустив проект. Обратимся к ресурсу в адресной строке браузера, набрав localhost:номер_порта/Account/Login: