Я поражен тем, что мне не удалось найти четкий пример того, как аутентифицировать пользователя прямо с экрана входа в систему до использования атрибута Authorize для моих методов 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 или чего-то подобного, чтобы запрашивать учетные данные пользователя и проверять их.
Отсюда мы можем разделить проблему на две части:
Аутентификация пользователей при использовании служб веб-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);
Межплатформенная аутентификация
Этот случай может быть, когда вы предоставляете только сервисы веб-API в веб-приложении, поэтому у вас будет другой клиент, использующий сервисы, клиент может быть другим веб-приложением или любым приложением .Net (Win Forms, WPF, консоль, служба Windows, и т.д)
Например, предположим, что вы будете использовать службу веб-API из другого веб-приложения в том же сетевом домене (в интрасети), в этом случае вы можете полагаться на проверку подлинности Windows, предоставляемую ASP.Net.
<authentication mode="Windows" />
Если ваши сервисы доступны в Интернете, вам необходимо будет передать аутентифицированные токены каждой службе Web API.
Для получения дополнительной информации, обратите внимание на следующие статьи: