Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Инфраструктура OWIN и AspNet Identity позволяют производить авторизацию через внешние сервисы с помощью аккаунтов в Google, Twitter, Facebook и т.д. Хотя подобная функциональность была доступна и предыдущей версии - в MVC 4, в MVC 5 ее механизм существенно изменился, и за аутентификацию отвечают компоненты OWIN.
Возьмем стандартный проект MVC 5, использующий AspNet Identity, то есть имеющий в качестве типа аутентификации Individual User Accounts. В проекте в папке App_Start мы можем увидеть файл Startup.Auth.cs, который отвечает за настройку конфигурации OWIN:
using System; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.Google; using Owin; using GoogleAuthApp.Models; namespace GoogleAuthApp { public partial class Startup { public void ConfigureAuth(IAppBuilder app) { app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() //{ // ClientId = "", // ClientSecret = "" //}); } } }
В конце метода ConfigureAuth можно увидеть ряд закомментированных по умолчанию строк, предназначенных для аутентификации через внешние сервисы. Например:
//app.UseFacebookAuthentication( // appId: "", // appSecret: "");
При регистрации нашего приложения в социальной сети Facebook мы получаем идентификатор приложения в рамках этой соцсети и секретное слово. Эти значения мы указываем для параметров appId и appSecret соответственно. И после этого, если у нас есть аккаунт в сети Facebook, мы можем авторизоваться в приложении через этот аккаунт. Довольно удобно - всего три строчки, а все остальное за нас сделает инфраструктура ASP.NET MVC.
Для примера выберем самый простой вариант - аутентификацию через Google. Чтобы подключаться к провайдерам аутентификации Google или Facebook, нам надо настроить проект на использование SSL. Для этого перейдем к панели свойств проекта и установим там параметр SSL Enabled равным True.
Вместе с установкой SSL также Visual Studio устанавливает и новый адрес для SSL-соединения: https://localhost:44300/, который мы будем использовать для аутентификации Google.
Теперь нам надо изменить адрес запуска проекта. Для этого скопируем ssl-адрес и перейдем в настройки проекта на вкладку Web. Вставим скопированный адрес в поле Project Url:
Прежде всего нам надо будет создать в аккаунте Google некоторые настройки, которые будут использоваться нашим приложением. Для этого авторизуемся в Google и перейдем к странице Google Developers Console:
На странице нажмем на кнопку Create Project. В появившемся окне введем название проекта и его ID:
Google автоматически генерирует некоторые значения, как на рисунке выше. И в принципе мы можем эти значения оставить. И через некоторое время будет создан новый проект, а перед нами откроется панель настроек проекта.
В левой колонке меню выберем пункт APIs & auth и далее выберем Consent screen. Здесь нам надо установить название приложение в поле Product Name, а также укажем email:
В моем случае название приложения TestAppForGoogleAuth. Сохраним, нажав внизу страницы на кнопку Save. После этого перейдем в левой панели меню к пункту Credentials и на открывшейся странице нажмем на кнопку Create New Client ID. Нам отобразится следующее диалоговое окно:
Тут есть несколько опций, которые надо установить. Во-первых, в поле APPLICATION TYPE оставим Web Application
В поле Authorized JavaScript введем ssl-адрес нашего приложения, который был установлен выше. Как правило, это https://localhost:44300/
После это в поле Authorized redirect URI введем https://localhost:44300/signin-google
После ввода всех данных нажмем на кнопку Create Client ID. После этого Google сгенерирует нам ряд аутентификационных настроек, которые мы будем использовать в приложении:
После получения аутентификационных настроек обновим файл Startup.Auth.cs:
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() { ClientId = "144182......................79hr.apps.googleusercontent.com", ClientSecret = "p-xu..............L" });
Затем перейдем в меню на вкладку APIs. Найдем пункт Google+ API и нажмем на кнопку OFF:
После всех настроек установим соответствующий атрибут ssl для контроллера HomeController:
[RequireHttps] public class HomeController : Controller { }
Запустим проект и обратимся к методу Login, увидим, что теперь нам доступно два способа входа на сайт: стандартный и через Google.
После этого приложение попросит принять некоторые разрешения для доступа к нашему аккаунту::
Нажмем на кнопку Принять, и после этого мы перейдем к поледнему шагу - регистрации внешнего логина, который будет отображаться на сайте для данного аккаунта:
И после этого в меню начнет отображаться логин
За отображение логина в представлении отвечает частичное представление _ExternalLoginsListPartial.
Данные пользователя после завершения визита на сайт не пропадают. Если мы откроем в окне Server Explorer используемую базу данных, то мы сможем увидеть, что в таблицу AspNetUserLogins, которая отвечает за связь логинов сайта с внешними аккаунтами, была добавлена новая запись:
Кроме того, так как был добавлен новый пользователь, соответствующая запись добавляется в таблицу AspNetUsers.
Таким образом, мы можем воспользоваться преимуществами OWIN и OAuth2 и добавить в приложение идентификацию с помощью внешних сервисов.