[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
В ASP.NET авторизація може бути реалізована за допомогою різних методів, таких як авторизація на основі ролей, авторизація на основі політик і авторизація на основі вимог. Нижче наведено кроки з реалізації авторизації в ASP.NET:
- Виберіть тип використовуваної авторизації: Як згадувалося раніше, існують різні типи методів авторизації. Виберіть той, який відповідає вашим потребам.
- Налаштуйте авторизацію: Після того як ви вибрали техніку авторизації, вам необхідно налаштувати її у вашому додатку. В ASP.NET ви можете налаштувати авторизацію на різних рівнях, таких як рівень сторінки, рівень контролера або рівень дій.
- Визначте ролі та політики: Якщо ви використовуєте авторизацію на основі ролей або політик, вам необхідно визначити ролі та політики у вашому додатку. Ви можете визначити ролі у файлі web.config або в базі даних. Політики визначаються за допомогою класу Policy в ASP.NET.
- Використовуйте атрибут [Authorize]: В ASP.NET ви можете використовувати атрибут [Authorize] для застосування авторизації до контролерів або дій. Цей атрибут гарантує, що доступ до контролера або дії буде дозволено тільки авторизованим користувачам.
- Використовуйте класи User і HttpContext: У своєму коді ви можете використовувати класи User і HttpContext для перевірки автентифікації користувача та отримання його ідентифікаційних даних.
- Обробка несанкціонованого доступу: Коли користувач намагається отримати доступ до ресурсу без відповідної авторизації, ASP.NET викидає виняток. Ви можете обробити це виключення і перенаправити користувача на користувацьку сторінку помилки або вивести повідомлення про помилку.
Загалом, впровадження авторизації в ASP.NET потребує ретельного планування та налаштування. Після налаштування вона допоможе забезпечити доступ тільки авторизованих користувачів до необхідних їм ресурсів.
У цьому прикладі ми розглянемо як зробити авторизацію на основі Identity.
ASP.NET Core Identity. Додавання з нуля.
Проєкт із типом аутентифікації “Individual User Accounts” дає змогу автоматично додавати всі файли, необхідні для роботи з ASP.NET Core Identity. Однак, як правило, всі стандартні можливості потрібні рідко, більше того, часто виникає необхідність більш детально доопрацювати різні компоненти, з яких складається Identity. І насправді, ми можемо вибрати будь-який інший тип проєкту і вручну додати його і виправити функціональність ASP.NET Core Identity.
Отже, спочатку створимо проект ASP.NET Core за шаблоном ASP.NET Core Web App (Model-View-Controller), але без аутентифікації:
Спочатку додамо в папку Models новий клас User:
1 2 3 4 |
public class User : IdentityUser { public int Year { get; set; } } |
Клас User представляє користувача і успадковується від класу IdentityUser, переймаючи всі його властивості. Крім того, для прикладу тут додано властивість Year, яка представлятиме рік народження користувача. За бажання можна визначити будь-які інші властивості.
Для взаємодії з MS SQL Server через ASP.NET Core Identity додамо в проект через Nuget пакети:
1 2 |
Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore.SqlServer |
Далі додамо в папку Models клас контексту даних ApplicationContext. Оскільки ми використовуємо Identity, то клас контексту даних буде успадковуватися не від DbContext, а від IdentityDbContext:
1 2 3 4 5 6 7 8 |
public class ApplicationContext : IdentityDbContext<User> { public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options) { Database.EnsureCreated(); } } |
У нас є контекст і моделі, і тепер нам необхідна база даних, яка буде зберігати всі дані. Спочатку визначимо у файлі appsettings.json рядок підключення:
1 2 3 |
"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=usersstoredb;Trusted_Connection=True;" }, |
Далі нам треба змінити клас Program, щоб застосувати всі необхідні сервіси для роботи з Identity і базою даних:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); IConfigurationRoot _confString = new ConfigurationBuilder(). SetBasePath(AppDomain.CurrentDomain.BaseDirectory).AddJsonFile("appsettings.json").Build(); builder.Services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(_confString.GetConnectionString("DefaultConnection"))); builder.Services.AddIdentity<User, IdentityRole>() .AddEntityFrameworkStores<ApplicationContext>(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); //подключение аутентификации app.UseAuthorization(); //подключение авторизации app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); |
Тепер система Identity під’єднана до проєкту, і ми можемо з нею працювати.
Реєстрація та створення користувачів в Identity
Продовжуємо працювати над проєктом, додамо в нього функціонал реєстрації користувачів. Користувачі в додатку представлені класом User, який успадковує безліч властивостей. Однак вам не потрібно встановлювати їх усі. Просто задайте ключові властивості, такі як логін і пароль.
Для цього краще скористатися допоміжною моделлю, яка встановить усі необхідні властивості. Отже, додамо в проєкт нову папку, яку назвемо ViewModels. Потім у цій папці визначимо новий клас RegisterViewModel, який представлятиме користувача, що реєструється:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class RegisterViewModel { [Required] [Display(Name = "Email")] [DataType(DataType.EmailAddress,ErrorMessage = "Не корректный E-Mail")] public string? Email { get; set; } [Required] [Display(Name = "Год рождения")] public int Year { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Пароль")] public string? Password { get; set; } [Required] [Compare("Password", ErrorMessage = "Пароли не совпадают")] [DataType(DataType.Password)] [Display(Name = "Подтвердить пароль")] public string? PasswordConfirm { get; set; } } |
Для роботи з обліковими записами користувачів додамо в папку Controllers новий контролер AccountController і визначимо в ньому метод для реєстрації користувачів:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class AccountController : Controller { private readonly UserManager<User> _userManager; private readonly SignInManager<User> _signInManager; public AccountController(UserManager<User> userManager, SignInManager<User> signInManager) { _userManager = userManager; _signInManager = signInManager; } [HttpGet] public IActionResult Register() { return View(); } [HttpPost] [AutoValidateAntiforgeryToken] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { User user = new User { Email = model.Email, UserName = model.Email, Year = model.Year }; // добавляем пользователя var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { // установка куки await _signInManager.SignInAsync(user, false); return RedirectToAction("Index", "Home"); } else { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } } return View(model); } } |
Оскільки в класі Program було додано сервіси Identity, то тут у контролері через конструктор ми можемо їх отримати. У цьому випадку ми отримуємо сервіс з управління користувачами – UserManager і сервіс SignInManager, який дає змогу автентифікувати користувача і встановлювати або видаляти його куки.
Для подань цього контролера в каталозі Views визначимо підкаталог Account, в який додамо нове подання Register.cshtml. Це подання слугуватиме для реєстрації користувача:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
@model WebApplication1.ViewModels.RegisterViewModel <h2>Регистрация нового пользователя</h2> <div class="row"> <div class="col-md-4"> <form asp-controller="Account" asp-action="Register"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Email" class="control-label"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Year" class="control-label"></label> <input asp-for="Year" class="form-control" /> <span asp-validation-for="Year" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password" class="control-label"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="PasswordConfirm" class="control-label"></label> <input asp-for="PasswordConfirm" class="form-control" /> <span asp-validation-for="PasswordConfirm" class="text-danger"></span> </div> <div class="form-group"><br /> <input type="submit" value="Регистрация" class="btn btn-primary" /> </div> </form> </div> </div> |
Запустимо додаток і звернемося до дії реєстрації. Введемо якісь дані:
Після вдалої реєстрації нас переадресує на головну сторінку.
Шановні ентузіасти програмування на C#!
З найкращими побажаннями,
[Леонід/ Dijix Company]
Авторизація користувачів в Identity
В ASP.NET Core авторизацією користувачів керують за допомогою фреймворка Identity, який забезпечує гнучку і просту у використанні систему для визначення і застосування політик управління доступом.
Для створення механізму авторизації користувачів у застосунку спочатку додамо в проєкт із минулої теми в папку ViewModels спеціальну модель LoginViewModel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class LoginViewModel { [Required] [Display(Name = "Email")] public string? Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Пароль")] public string? Password { get; set; } [Display(Name = "Запомнить?")] public bool RememberMe { get; set; } public string? ReturnUrl { get; set; } } |
У минулій темі в нас уже було додано контролер AccountController. Тепер же додамо в нього такі три методи:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
[HttpGet] public IActionResult Login(string returnUrl = null) { return View(new LoginViewModel { ReturnUrl = returnUrl }); } [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false); if (result.Succeeded) { // проверяем, принадлежит ли URL приложению if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl)) { return Redirect(model.ReturnUrl); } else { return RedirectToAction("Index", "Home"); } } else { ModelState.AddModelError("", "Неправильный логин и (или) пароль"); } } return View(model); } [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Logout() { // удаляем аутентификационные куки await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } |
І тепер визначимо в проєкті в папці Views/Account подання Login.cshtml, через яке здійснюватиметься вхід у застосунок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@model WebApplication1.ViewModels.LoginViewModel <h2>Вход в приложение</h2> <div class="row"> <div class="col-md-4"> <form method="post" asp-controller="Account" asp-action="Login" asp-route-returnUrl="@Model.ReturnUrl"> <div asp-validation-summary="ModelOnly"></div> <div class="form-group"> <label asp-for="Email" class="control-label"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password" class="control-label"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div> <label asp-for="RememberMe" class="control-label"></label><br /> <input asp-for="RememberMe" class="form-check" /> </div> <div class="form-group"><br /> <input type="submit" value="Войти" class="btn btn-primary" /> </div> </form> </div> </div> |
Для перевірки логіна, для простоти визначимо в поданні Index.cshtml контролера HomeController виведення імені користувача та посилання на вхід і реєстрацію:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@if(User.Identity.IsAuthenticated) { <p>@User.Identity.Name</p> <form method="post" asp-controller="Account" asp-action="Logout"> <input type="submit" value="Выход" /> </form> } else { <a asp-controller="Account" asp-action="Login">Вход</a> <a asp-controller="Account" asp-action="Register">Регистрация</a> } |
Запустимо проєкт і виконаємо вхід у додаток. І після вдалої авторизації на головній сторінці побачимо своє ім’я та кнопку для виходу.
Поради щодо авторизації
- Використовуйте авторизацію на основі ролей: Призначте користувачам ролі та авторизуйте доступ на основі цих ролей. Це поширений спосіб керування авторизацією у веб-додатках.
- Використовуйте авторизацію на основі тверджень: Використовуйте твердження для вказівки додаткової інформації про користувача, окрім його ролі, такої як відділ, посада або інші атрибути. Твердження можна використовувати для створення тонкого контролю доступу.
- Реалізуйте авторизацію на основі атрибутів: Використовуйте атрибути для застосування правил авторизації до дій або методів контролера. Цей підхід простий у реалізації та може спростити логіку авторизації.
- Захистіть конфіденційні дані: Захищайте конфіденційні дані, як-от паролі та інші облікові дані, за допомогою шифрування та інших заходів безпеки.
- Використовуйте найменші привілеї: Надавайте користувачам мінімальний обсяг доступу, необхідний для виконання їхніх завдань. Це допоможе запобігти несанкціонованому доступу та знизить ризик витоку даних.
- Впроваджуйте аудит: Записуйте і відстежуйте дії користувачів, щоб виявити підозрілу поведінку і потенційні порушення безпеки.
- Використовуйте двофакторну автентифікацію: Вимагайте від користувачів надання додаткових факторів автентифікації, наприклад, коду, надісланого на телефон або електронну пошту, для доступу до важливих ресурсів.
- Регулярно переглядайте та оновлюйте правила авторизації: Постійно оновлюйте правила авторизації, щоб відобразити зміни в організації, застосунку або ризиках безпеки.
Ці поради допоможуть вам реалізувати ефективну авторизацію у ваших додатках C# і захистити дані та ресурси вашої організації.
Я сподіваюся, що вам сподобалося читати цю статтю, і вона виявилася легкою для розуміння. Будь ласка, дайте мені знати, якщо у вас є які-небудь коментарі або виправлення.
Так само вам може бути цікава попередня стаття – Поширені приклади регулярних виразів.
Ви хочете навчитися писати код мовою програмування C#?
Створювати різні інформаційні системи, що складаються з сайтів, мобільних клієнтів, десктопних додатків, телеграм-ботів тощо.
Переходьте до нас на сторінку Dijix і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:
- Доступ до пройденого матеріалу
- Тематичні статті
- Бібліотека книг
- Онлайн тестування
- Спілкування в закритих групах