dir.by  
Программирование, разработка, тестирование
ASP.NET MVC (web сайт на архитектуре Model-View-Controller)
Пишем приложение "Планирование дел, задач" в ASP.NET MVC
Аутентификация (login/register/logout) в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
  Посмотрели 7772 раз(а)    
 Аутентификация (login/register/logout) в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017 
последнее обновление: 15 января 2019
Шаг 1. В web.config включаем аутентификацию форм
Внутри секции <system.web> добавим
<authentication mode="Forms">
     <forms name="cookies" timeout="2880" loginUrl="~/Authentication/Login" ></forms>
</authentication>
  Файл web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
     For more information on how to configure your ASP.NET application, please visit
     https://go.microsoft.com/fwlink/?LinkId=301880
-->

<configuration>
     <configSections>
          <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
          <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
     </configSections>
     <appSettings>
          <add key="webpages:Version" value="3.0.0.0" />
          <add key="webpages:Enabled" value="false" />
          <add key="ClientValidationEnabled" value="true" />
          <add key="UnobtrusiveJavaScriptEnabled" value="true" />
     </appSettings>
     <system.web>
          <compilation debug="true" targetFramework="4.6.1" />
          <httpRuntime targetFramework="4.6.1" />
          <authentication mode="Forms">
               <forms name="cookies" timeout="2880" loginUrl="~/Authentication/Login" ></forms>
          </authentication>
     </system.web>
     <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
               <dependentAssembly>
                    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
                    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
               </dependentAssembly>
               <dependentAssembly>
                    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
                    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
               </dependentAssembly>
               <dependentAssembly>
                    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                    <bindingRedirect oldVersion="1.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
               </dependentAssembly>
          </assemblyBinding>
     </runtime>
     <system.codedom>
          <compilers>
               <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
               <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
          </compilers>
     </system.codedom>

     <connectionStrings>
          <add name="MyConnection1" connectionString="Data Source=EVGEN\SQLEXPRESS;Initial Catalog=MyDatabase1;Integrated Security=True;" providerName="System.Data.SqlClient" />
     </connectionStrings>

     <entityFramework>
          <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
          <providers>
               <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          </providers>
     </entityFramework>
</configuration>
Шаг 2. Добавим файл UserContext.cs в папку Models (класс User и класс UserContext для работы с Базой данных)
Нажмем правой клавишей мыши на папку "Models"AddNew Item
  C#     В файле UserContext.cs напишем код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace Plan.Models
{
     public class UserContext : DbContext
     {
          // MyConnection1 это соединение с базой данных описанное в файле web.config
          public UserContext() : base("MyConnection1")
          {
          }

          public DbSet<User> Users { get; set; }
     }

     public class User
     {
          public int Id { get; set; }
          public string Email { get; set; }
          public string Password { get; set; }
     }
}
Шаг 3. Добавим файл UserLoginRegister.cs в папку Models (класс UserLogin и класс UserRegister)
При логине в форме мы будем использовать
класс UserLogin

При регистрации в форме мы будем использовать
класс UserRegister

Добавим файл UserLoginRegister.cs в папку Models
  C#     В файле UserLoginRegister.cs напишем код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace Plan.Models
{
     public class UserLogin
     {
          [Required]
          public string Name { get; set; }

          [Required]
          [DataType(DataType.Password)]
          public string Password { get; set; }
     }

     public class UserRegister
     {
          [Required]
          public string Name { get; set; }

          [Required]
          [DataType(DataType.Password)]
          public string Password { get; set; }

          [Required]
          [DataType(DataType.Password)]
          [Compare("Password", ErrorMessage = "Пароли не совпадают")]
          public string ConfirmPassword { get; set; }

          [Required]
          public int Age { get; set; }
     }
}
Шаг 4. Добавляем AuthenticationController
Чтобы добавить контроллер в наш проект в окне Solution Explorer нажимаем правой клавишей мыши на
ControllersAddController
  C#     В файле AuthenticationController.cs напишем код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Plan.Models;

namespace Plan.Controllers
{
     public class AuthenticationController : Controller
     {
          public ActionResult Login()
          {
               return View();
          }

          [HttpPost]
          [ValidateAntiForgeryToken]
          public ActionResult Login(UserLogin model)
          {
               if (ModelState.IsValid)
               {
                    // поиск пользователя в базе данных
                    User user = null;
                    using (UserContext db = new UserContext())
                    {
                         user = db.Users.FirstOrDefault(u => u.Email == model.Name && u.Password == model.Password);
                    }

                    // нашли пользователя
                    if (user != null)
                    {
                         // устанавливаем cookie
                         FormsAuthentication.SetAuthCookie(model.Name, true);

                         // переходим
                         return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                         // выводим ошибку
                         ModelState.AddModelError("", "Пользователя с таким логином и паролем нет");
                    }
               }

               return View(model);
          }

          public ActionResult Register()
          {
               return View();
          }

          [HttpPost]
          [ValidateAntiForgeryToken]
          public ActionResult Register(UserRegister model)
          {
               if (ModelState.IsValid)
               {
                    // ищем пользователя в базе данных
                    User user = null;
                    using (UserContext db = new UserContext())
                    {
                         user = db.Users.FirstOrDefault(u => u.Email == model.Name);
                    }

                    // пользователя нет базе данных
                    if (user == null)
                    {
                         // создаем нового пользователя
                         using (UserContext db = new UserContext())
                         {
                              db.Users.Add(new User { Email = model.Name, Password = model.Password});
                              db.SaveChanges();

                              user = db.Users.Where(u => u.Email == model.Name && u.Password == model.Password).FirstOrDefault();
                         }

                         // пользователь добавлен в базу данных
                         if (user != null)
                         {
                              // устанавливаем cookie
                              FormsAuthentication.SetAuthCookie(model.Name, true);

                              // переходим
                              return RedirectToAction("Index", "Home");
                         }
                    }
                    else
                    {
                         // выводим ошибку
                         ModelState.AddModelError("", "Пользователь с таким логином уже существует");
                    }
               }

               return View(model);
          }

          public ActionResult Logoff()
          {
               FormsAuthentication.SignOut();
               return RedirectToAction("Index", "Home");
          }
     }
}
Шаг 5. Добавляем View с названием Login
Нажимаем правой клавишей мыши по методу Login в файле AuthenticationController.cs и нажимаем на Add View ...
  В файле Login.cshtml напишем код
@model Plan.Models.UserLogin

<!DOCTYPE html>

<html>
<head>
     <meta name="viewport" content="width=device-width" />
     <title>Вход</title>
</head>

<body>

     <!-- подключаем файлы Bootstrap -->
     <link href='@Url.Content("~/Content/bootstrap.min.css")' rel="stylesheet" type="text/css" />
     <script src='@Url.Content("~/Scripts/bootstrap.min.js")'></script>

     @using (Html.BeginForm())
     {
          @Html.AntiForgeryToken()

          <div class="pl-4">
               @Html.ValidationSummary(true)

               <!-- заголовок -->
               <div class="form-group">
                    <h2>Вход</h2>
               </div>

               <!-- login -->
               <div class="form-group">
                    @Html.LabelFor(model => model.Name, new { @class = "control-label" })
                    <div>
                         @Html.EditorFor(model => model.Name, new { @class = "form-control" })
                         @Html.ValidationMessageFor(model => model.Name)
                    </div>
               </div>

               <!-- password -->
               <div class="form-group">
                    @Html.LabelFor(model => model.Password, new { @class = "control-label" })
                    <div>
                         @Html.EditorFor(model => model.Password, new { @class = "form-control" })
                         @Html.ValidationMessageFor(model => model.Password)
                    </div>
               </div>

               <!-- Войти -->
               <div class="form-group">
                    <input type="submit" value="Войти" class="btn btn-info" />
               </div>
          </div>
     }

</body>
</html>
Шаг 6. Добавляем View с названием Register
Нажимаем правой клавишей мыши по методу Register в файле AuthenticationController.cs и нажимаем на Add View ...
  В файле Register.cshtml напишем код
@model Plan.Models.UserRegister

<!DOCTYPE html>

<html>
<head>
     <meta name="viewport" content="width=device-width" />
     <title>Регистрация</title>
</head>

<body>

     <!-- подключаем файлы Bootstrap -->
     <link href='@Url.Content("~/Content/bootstrap.min.css")' rel="stylesheet" type="text/css" />
     <script src='@Url.Content("~/Scripts/bootstrap.min.js")'></script>

     @using (Html.BeginForm())
     {
          @Html.AntiForgeryToken()

          <div class="pl-4">
               @Html.ValidationSummary(true)

               <!-- Заголовок -->
               <div class="form-group">
                    <h2>Регистрация</h2>
               </div>

               <!-- login -->
               <div class="form-group">
                    @Html.LabelFor(model => model.Name, new { @class = "control-label" })
                    <div>
                         @Html.EditorFor(model => model.Name, new { @class = "form-control" })
                         @Html.ValidationMessageFor(model => model.Name)
                    </div>
               </div>

               <!-- password -->
               <div class="form-group">
                    @Html.LabelFor(model => model.Password, new { @class = "control-label" })
                    <div>
                         @Html.EditorFor(model => model.Password, new { @class = "form-control" })
                         @Html.ValidationMessageFor(model => model.Password)
                    </div>
               </div>

               <!-- confirm password -->
               <div class="form-group">
                    @Html.LabelFor(model => model.ConfirmPassword, new { @class = "control-label" })
                    <div>
                         @Html.EditorFor(model => model.ConfirmPassword, new { @class = "form-control" })
                         @Html.ValidationMessageFor(model => model.ConfirmPassword)
                    </div>
               </div>

               <!-- Сохранить -->
               <div class="form-group">
                    <input type="submit" value="Сохранить" class="btn btn-info" />
               </div>
          </div>
     }

</body>
</html>
Шаг 7. В файле Views/MasterTemplate.cshtml напишем код
  cshtml  
@{
     Layout = null;
}

@{
     // переменные чтобы выставить активность или не активность в кнопках меню
     string MenuActiveList = "active";
     string MenuActiveReport = "";
     string MenuActiveChange = "";

     int ImgVersionToRefresh = 8;
}

<!DOCTYPE html>

<html>
<head>
     <meta name="viewport" content="width=device-width" />
     <title>MasterTemplate</title>
</head>

<body>
     <!-- подключаем файлы jQuery -->
     <script src='@Url.Content("~/Scripts/jquery-3.0.0.min.js")'></script>

     <!-- подключаем файлы Bootstrap -->
     <link href='@Url.Content("~/Content/bootstrap.min.css")' rel="stylesheet" type="text/css" />
     <script src='@Url.Content("~/Scripts/bootstrap.min.js")'></script>
    
     <!-- HTML элементы -->
     <div class="container">

          <div class="row">

               <div class="col-md-12" style="">

                    <!-- верхнее меню1 -->
                    <nav class="navbar navbar-expand-sm bg-light navbar-light">

                         <ul class="navbar-nav mr-auto">
                              <li class="nav-item">
                                   @Html.Label("Планирование дел, задач", new { @class = "" })
                              </li>
                         </ul>

                         <!-- кнопки в меню "Выйти", "Войти", "Регистрация" -->
                         <!-- Эти кнопки с правой стороны потому что в предыдущем ul стоит class='... mr-auto' -->
                         <ul class="navbar-nav">

                              <!-- проверяем пользователь залогинен? -->
                              @if (User.Identity.IsAuthenticated)
                              {
                                   <!-- имя пользователя -->
                                   <li class="nav-item">
                                        <span class="navbar-text">
                                             [ @User.Identity.Name ]
                                        </span>
                                   </li>

                                   <!-- кнопка 'Выйти' -->
                                   <li class="nav-item">
                                        <a class="nav-link" href='@Url.Action("Logoff", "Authentication")'> Выйти... </a>
                                   </li>
                              }

                              else
                              {
                                   <!-- кнопка 'Войти' -->
                                   <li class="nav-item">
                                        <a class="nav-link" href='@Url.Action("Login", "Authentication")'> Войти... </a>
                                   </li>

                                   <!-- мой разделитель -->
                                   <li class="nav-item">
                                        <span class="navbar-text">
                                             |
                                        </span>
                                   </li>

                                   <!-- Регистрация -->
                                   <li class="nav-item">
                                        <a class="nav-link" href='@Url.Action("Register", "Authentication")'> Регистрация... </a>
                                   </li>
                              }
                         </ul>
                    </nav>
               </div>
          </div>

          <div class="row">

               <div class="col-md-12" style="min-height:600px; padding-left:0px; padding-right:0px; border:3px solid gray; background-repeat:repeat-y; background-image:url(@Url.Content("~/Content/Images/PageBorder.png?version=" + ImgVersionToRefresh));">

                    <!-- верхнее меню2 -->
                    <nav class="navbar navbar-expand-sm bg-info navbar-info">

                         <!-- кнопки в меню "Список дел", "Отчеты", "Управление (поменять, добавить, удалить)" -->
                         <ul class="navbar-nav mr-auto">
                              <!-- кнопка "Список дел" -->
                              <li class="nav-item ml-5">
                                   <a class="btn btn-info @MenuActiveList" href='@Url.Action("Index")'>Список дел</a>
                              </li>

                              <!-- кнопка "Отчеты" -->
                              <li class="nav-item ml-5">
                                   <a class="btn btn-info @MenuActiveReport" href='@Url.Action("Report")'>Отчеты</a>
                              </li>

                              <!-- кнопка "Управление" -->
                              <li class="nav-item ml-5">
                                   <a class="btn btn-info @MenuActiveChange" href='@Url.Action("Change")'>Управление (поменять, добавить, удалить)</a>
                              </li>
                         </ul>
                    </nav>

                    <!-- тут вставится содержимое обычного представления -->
                    <div style="padding-left:60px; padding-top:20px;">
                         @RenderBody()
                    </div>
               </div>

          </div>
     </div>
</body>
</html>
Шаг 8. Запустим ASP.NET MVC приложение
Нажимаем Регистрация
При входе вводим логин и пароль
Когда вошли, мы видим имя залогиненного пользователя.
 
← Предыдущая тема
Добавляем библиотеку Entity Framework и создаем соединиение с Базой данных в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
 
Следующая тема →
Добавляем класс "Task" для сохранения дел, задач в базу данных в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
 
Ваши Отзывы ... комментарии ...
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

Экскурсии по Москве Экскурсии по Москве: пешеходные, автобусные и речные прогулки на любой вкус
  Объявления  
  Объявления  
 
Что такое MVC в ASP.NET ?
Создаем новое приложение ASP.NET MVC
Контроллер (Controller)
Передаем данные из контроллера в представление в ASP.NET MVC. Используем ViewBag, ViewData, TempData, Model (строго типизированное представление)
Представление (View)
Что такое View (представление) и операторы Razor в ASP.NET MVC
Создаем переменную и выводим на экран во View в ASP.NET MVC
@using внутри View в ASP.NET MVC
@foreach(var item in arr) {...} внутри View в ASP.NET MVC
@DateTime.Now внутри View в ASP.NET MVC
Как узнать имя контроллера внутри View в ASP.NET MVC
Отображаем [DateTime | только Date | только Time] в нужном формате в ASP.NET MVC
Разновидности представлений (View)
Строго типизированное представление (Strongly-typed-view) в ASP.NET MVC
...
Мастер представление (Master View) с использованием @RenderBody() в ASP.NET MVC
Мастер представление (Master View) с использованием @RenderBody() и дополнительных секций @RenderSection в ASP.NET MVC
...
Частичное представление (Partial View) в ASP.NET MVC. Встраиваем частичное представление @Html.Partial("My1") и @{ Html.RenderPartial("My1");}
При нажатии submit внутри partial view происходит ajax вызов метода controller. Метод controller должен возвращать PartialView(model) | ASP.NET MVC
...
Строго типизированное частичное представление (Strongly-typed partial view) в ASP.NET MVC
Создаем папку ViewModels. Это хороший стиль программирования для передачи данных из Controller во View
Создаем папку ViewModels. Создаем свой класс в папке ViewModels. Это хороший стиль программирования для передачи данных из Controller во View. Web приложение ASP.NET MVC
Атрибуты. Используем атрибуты во ViewModels(чтобы показать кнопки, combo в представлении). Используем атрибуты в Controller (чтобы улучшить методы)
Аттрибут [Display(Name = "...")] описывается в C# классе и используется в @Html.LabelFor, @Html.DisplayNameFor в ASP.NET MVC
Аттрибут [Required(ErrorMessage = "Пожалуйста, введите название")] описывается для свойства в C# классе и требует чтобы свойство было заполнено, если не заполнено на экране ошибка ErrorMessage в ASP.NET MVC
Аттрибут [Remote("IsValidAuthor", "Home", ErrorMessage = "Enter correct author of book")] описывается для свойства в C# классе и проверяет это свойство на правильность на сервере через метод IsValidAuthor в conroller Home, если метод возвращает false, то на экране будет ошибка ErrorMessage в ASP.NET MVC
Аттрибут [HiddenInput(DisplayValue = false)] описывается в C# классе и используется в @Html.HiddenFor в ASP.NET MVC
Маршрутизация
Ссылки и перенаправления в представлении
@Html.ActionLink внутри View в ASP.NET MVC
@Html.RouteLink внутри View в ASP.NET MVC
@Url.Action внутри View в ASP.NET MVC
@Url.RouteUrl внутри View в ASP.NET MVC
@Url.Content внутри View в ASP.NET MVC
Bootstrap в MVC
Добавляем и подключаем Bootstrap (css, js файлы) в ASP.NET MVC проект
JQuery в МVС
Подключаем JQuery в ASP.NET MVC проект
С помощью JQuery получаем содержимое View (представления) в ASP.NET MVC. Пример: $.get("/Home/Index", function (data) {...}) ...
Класс AjaxExtensions в МVС (асинхронное получение данных)
Подключаем jQuery & AJAX в ASP.NET MVC проект
С помощью Ajax.ActionLink получаем содержимое View (представления) и вставляем в div в ASP.NET MVC
Объект Ajax (это класс AjaxExtensions) в ASP.NET МVС
База данных (Entity Framework) в ASP.NET MVC
Entity Framework в приложении ASP.NET MVC. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
Аутентификация (login/register/logout)
Что такое аутентификация (login/register/logout) в ASP.NET MVC ?
Пример: Аутентификация (login/register/logout) в ASP.NET MVC используя аутентификацию форм FormsAuthentication.SetAuthCookie(model.Name, true);
Авторизация (admin/user/...)
Что такое авторизация (admin/user/...) в ASP.NET MVC ?
Пример: Авторизация (admin/user/...) в ASP.NET MVC используя провайдер ролей RoleProvider
Пишем приложение "Планирование дел, задач" в ASP.NET MVC
Создаем пустое приложение "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Добавляем библиотеки Bootstrap & jQuery в приложение "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Создаем мастер-представление (главное меню & логин кнопки используя Bootstrap) в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Добавляем контроллер "Home" и представление "Index" (главная страница в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Добавляем библиотеку Entity Framework и создаем соединиение с Базой данных в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Аутентификация (login/register/logout) в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Добавляем класс "Task" для сохранения дел, задач в базу данных в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Добавление nUnit в приложении "Планирование дел, задач" | ASP.NET MVC | Visual Studio 2017
Дополнительные темы, вопросы
Чем ASP.NET MVC лучше ASP.NET Web Forms ?
Выбор между ASP.NET Core и ASP.NET ?
Как выбрать интернет браузер чтобы в нем запускался .NET проект
Как узнать локальный адрес и порт вашего ASP.NET MVC приложения ?
Scripts\index.d.ts(8,1): error TS1008: Build:Unexpected token; 'module, class, interface, enum, import or statement' expected. Scripts\index.d.ts(8,13): error TS1005: Build:';' expected. в Visual Studio 2017 в приложении ASP.NET MVC
Error "unable to connect to web server "iis express" | ASP.NET MVC | Visual Studio 2017
Error "This site can't be reached" when run ASP.NET application | Solution: Recreate the Self-Signed HTTPS Certificate for localhost in IIS Express
WWW сайты для изучения ASP.NET MVC
Cайты для изучения ASP.NET MVC

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика