Пример: Аутентификация (login/register/logout) в ASP.NET MVC используя аутентификацию форм FormsAuthentication.SetAuthCookie(model.Name, true);
последнее обновление: 13 января 2019
Пример работает так:
• мы создаем таблицу в базе данных с полями login , password
• при регистрации пользователя мы добавляем login , password в нашу таблицу базы данных.
• при логине (пользователь вводит login и password).
Получаем введенный login , password и ищем в базе данных.
Если нашли значит пользователя будем логинить (сохраняем его в cookie через Аутентификация форм FormsAuthentication.SetAuthCookie (model.Name, true);
• при logout мы удаляем пользовател из cookie
Шаг 1. Создаем новый ASP.NET MVC проект в Visual Studio 2017
Шаг 2. В web.config включаем аутентификацию форм
Внутри секции <system.web> добавим
<authentication mode="Forms">
<forms name="cookies" timeout="2880" loginUrl="~/Account/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>
<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="~/Account/Login" />
</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>
</configuration>
Установив mode="Forms" , мы тем самым подключаем аутентификацию форм.
name
имя для куки-набора. Значение по умолчанию - ".ASPXAUTH"
path
задает путь для куки-наборов. Значение по умолчанию - "/"
timeout
определяет срок действия куков в минутах
loginUrl
адрес для аутентификации пользователя. Значение по умолчанию - "~/Account/Login"
Шаг 3. Добавляем библиотеку Entity Framework используя NuGet
Шаг 4. Создаем соединиение с Базой данных Microsoft SQL Server в файле Web.config
Добавляем соединение <connectionStrings>...</connectionStrings> к Базе данных в файле Web.config
Новые добавленные строчки помеченные синим
Файл 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="~/Account/Login" />
</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=EVGENI\MSSQLSERVER2012;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>
На заметку!
•
Initial Catalog=MyDatabase1 это название базы данных. Если такое название не существует то новая база данных будет создана.
•
name="MyConnection1 " пишем любой текст это имя соединения. Это имя соединения будем использовать в C# классах.
•
Data Source=EVGENIMSSQLSERVER2012 это имя сервера базы данных (SQL Server name). Сервер базы данных может находится локально или на другом компьютере. Имя сервера базы данных появляется при открытии
SQL Server Management Studio (на картинке нарисовано).
Шаг 5. Добавим файл UserContext.cs в папку Models (класс User и класс UserContext для работы с Базой данных)
Нажмем правой клавишей мыши на папку "Models" → Add → New Item
C#
В файле UserContext.cs напишем код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
namespace WebApplication1.Models
{
public class UserContext : DbContext
{
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; }
public int Age { get; set; }
}
}
Шаг 6. Добавим файл 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 WebApplication1.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; }
}
}
Шаг 7. Добавляем HomeController
Чтобы добавить контроллер в наш проект в окне Solution Explorer нажимаем правой клавишей мыши на
Controllers → Add → Controller
C#
В файле HomeController.cs напишем код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;
using System.Web.Security;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index ()
{
return View();
}
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)
{
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, Age = model.Age });
db.SaveChanges();
user = db.Users.Where(u => u.Email == model.Name && u.Password == model.Password).FirstOrDefault();
}
// если пользователь удачно добавлен в бд
if (user != null)
{
FormsAuthentication.SetAuthCookie(model.Name, true);
return RedirectToAction("Index" , "Home" );
}
}
else
{
ModelState.AddModelError("", "Пользователь с таким логином уже существует" );
}
}
return View(model);
}
public ActionResult Logoff ()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index" , "Home" );
}
}
}
Шаг 8. Добавляем View с названием Index
Нажимаем правой клавишей мыши по методу Index в файле HomeController.cs и нажимаем на Add View ...
В файле Index.cshtml напишем код
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title> Index</title>
</head>
<body>
<div>
@if (User.Identity.IsAuthenticated)
{
@Html.ActionLink("logout..." , "Logoff" )
}
else
{
@Html.ActionLink("login" , "Login" )
@Html.Label(" | " );
@Html.ActionLink("register" , "Register" )
}
</div>
</body>
</html>
Шаг 9. Добавляем View с названием Login
В файле Login.cshtml напишем код
@model WebApplication1.Models.UserLogin
@{
ViewBag.Title = "Вход" ;
}
<h2> Вход</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal" >
@Html.ValidationSummary(true)
<div class="form-group" >
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>
<div class="form-group" >
@Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
</div>
<div class="form-group" >
<div class="col-md-offset-2 col-md-10" >
<input type="submit" value="Войти" class="btn btn-default" />
</div>
</div>
</div>
}
Шаг 10. Добавляем View с названием Register
Нажимаем правой клавишей мыши по методу Register в файле HomeController.cs и нажимаем на Add View ...
В файле Register.cshtml напишем код
@model WebApplication1.Models.UserRegister
@{
ViewBag.Title = "Регистрация" ;
}
<h2> Регистрация</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal" >
@Html.ValidationSummary(true)
<div class="form-group" >
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>
<div class="form-group" >
@Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
</div>
<div class="form-group" >
@Html.LabelFor(model => model.ConfirmPassword, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.ConfirmPassword)
@Html.ValidationMessageFor(model => model.ConfirmPassword)
</div>
</div>
<div class="form-group" >
@Html.LabelFor(model => model.Age, new { @class = "control-label col-md-2" })
<div class="col-md-10" >
@Html.EditorFor(model => model.Age)
@Html.ValidationMessageFor(model => model.Age)
</div>
</div>
<div class="form-group" >
<div class="col-md-offset-2 col-md-10" >
<input type="submit" value="Зарегистрировать" class="btn btn-default" />
</div>
</div>
</div>
}
Шаг 11. Запускаем ASP.NET MVC приложение
Нажимаем вверху на зеленый треугольник
Все работает!
Наиболее вероятные причины:
•Указанный каталог или файл не существует на данном веб-сервере.
•URL-адрес содержит орфографическую ошибку.
•Специальный фильтр или модуль, такой как URLScan, ограничивает доступ к файлу. Что можно предпринять:
•Создайте содержимое на веб-сервере.
•Проверьте URL-адрес веб-браузера.
•Чтобы получить дополнительные сведения об этой ошибке, проверьте журнал трассировки для невыполненных запросов и определите, какой модуль вызывает SetStatus.
Detailed Error Information: Module IIS Web Core Notification MapRequestHandler Handler StaticFile Error Code 0x80070002
1) Название контролера: CarController
метод контролера: Audi
не совпадают с путем в google chrome пример: http://localhost:8080/Car/VW ← неправильно
Путь в google chrome должен быть такой: http://localhost:8080/Car/Audi ← правильно
2) В visual studio в проекте view должна находиться тут:
Views/Car/Audi.cshtml ответить