Создание контроллера AccountController

Последнее обновление: 31.10.2015

При входе пользователя на сайт его работа буде начинаться с авторизации, и первое что пользователь увидит - это страница авторизации. А за всю логику авторизации будет отвечать контроллер 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:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850