Я вражений тим, як мені не вдалося знайти чіткого прикладу того, як автентифікувати користувача прямо з екрана входу до використання атрибута "Авторизувати" через мої методи ApiController через кілька годин роботи в Google.
Це тому, що ви плутаєтеся в цих двох поняттях:
Автентифікація - це механізм, за допомогою якого системи можуть безпечно ідентифікувати своїх користувачів. Системи аутентифікації дають відповіді на запитання:
- Хто користувач?
- Чи дійсно користувач тим, ким він / вона представляє себе?
Авторизація - це механізм, за допомогою якого система визначає, який рівень доступу конкретного аутентифікованого користувача повинен мати захищені ресурси, контрольовані системою. Наприклад, система управління базами даних може бути спроектована таким чином, щоб надати певним визначеним особам можливість отримувати інформацію з бази даних, але не можливість змінювати дані, що зберігаються в даті бази даних, надаючи іншим особам можливість змінювати дані. Системи авторизації надають відповіді на запитання:
- Чи має право користувач X отримати доступ до ресурсу R?
- Чи має право користувач X виконувати операцію P?
- Чи користувач X має право виконувати операцію P на ресурсі R?
Authorize
Атрибут в MVC використовується для застосування правил доступу, наприклад:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
Вищезазначене правило дозволить отримати доступ до методу лише користувачам у ролях адміністраторів та супер користувачів
Ці правила також можна встановити у файлі web.config, використовуючи location
елемент. Приклад:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Однак перед тим, як виконувати ці правила авторизації, вам потрібно пройти автентифікацію на поточному веб-сайті .
Хоча ці пояснюють, як обробляти несанкціоновані запити, вони не демонструють чітко щось на кшталт LoginController або щось подібне, щоб запитувати облікові дані користувачів та перевіряти їх.
Звідси ми могли розділити проблему на два:
Ідентифікуйте користувачів, коли користуються послугами Web API в межах однієї веб-програми
Це був би найпростіший підхід, оскільки ви покладаєтесь на автентифікацію в ASP.Net
Це простий приклад:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
Користувачів буде переспрямовано до маршруту облікового запису / входу , там ви зробите власні елементи керування, щоб запитати облікові дані користувачів, а потім встановите cookie автентифікації, використовуючи:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
Перехресна аутентифікація
Цей випадок буде, коли ви відкриваєте лише послуги Web API у веб-додатку, тому у вас буде інший клієнт, який споживає послуги, клієнт може бути іншим веб-додатком або будь-яким додатком .Net (Win Forms, WPF, консоль, служба Windows, тощо)
Наприклад, припустимо, що ви будете користуватися послугою Web API з іншої веб-програми в тому ж мережевому домені (в межах інтрамережі), в цьому випадку ви можете покластися на автентифікацію Windows, надану ASP.Net.
<authentication mode="Windows" />
Якщо ваші послуги доступні в Інтернеті, вам потрібно буде передати аутентифіковані жетони до кожної служби Web API.
Для отримання додаткової інформації вийдіть на наступні статті: