Авторизация через внешние сервисы

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Инфраструктура 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 in ASP.NET MVC

Вместе с установкой SSL также Visual Studio устанавливает и новый адрес для SSL-соединения: https://localhost:44300/, который мы будем использовать для аутентификации Google.

Теперь нам надо изменить адрес запуска проекта. Для этого скопируем ssl-адрес и перейдем в настройки проекта на вкладку Web. Вставим скопированный адрес в поле Project Url:

Изменение адреса запуска в ASP.NET MVC

Прежде всего нам надо будет создать в аккаунте Google некоторые настройки, которые будут использоваться нашим приложением. Для этого авторизуемся в Google и перейдем к странице Google Developers Console:

Авторизация Google в Asp.Net MVC 5

На странице нажмем на кнопку Create Project. В появившемся окне введем название проекта и его ID:

Авторизация Google в Oath2

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 сгенерирует нам ряд аутентификационных настроек, которые мы будем использовать в приложении:

Подключение к Google в ASP.NET MVC

После получения аутентификационных настроек обновим файл Startup.Auth.cs:

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "144182......................79hr.apps.googleusercontent.com",
    ClientSecret = "p-xu..............L"
});

Затем перейдем в меню на вкладку APIs. Найдем пункт Google+ API и нажмем на кнопку OFF:

Авторизация Google+ и ASP.NET MVC

После всех настроек установим соответствующий атрибут ssl для контроллера HomeController:

[RequireHttps]
public class HomeController : Controller
{
}

Запустим проект и обратимся к методу Login, увидим, что теперь нам доступно два способа входа на сайт: стандартный и через Google.

После этого приложение попросит принять некоторые разрешения для доступа к нашему аккаунту::

Нажмем на кнопку Принять, и после этого мы перейдем к поледнему шагу - регистрации внешнего логина, который будет отображаться на сайте для данного аккаунта:

И после этого в меню начнет отображаться логин

За отображение логина в представлении отвечает частичное представление _ExternalLoginsListPartial.

Данные пользователя после завершения визита на сайт не пропадают. Если мы откроем в окне Server Explorer используемую базу данных, то мы сможем увидеть, что в таблицу AspNetUserLogins, которая отвечает за связь логинов сайта с внешними аккаунтами, была добавлена новая запись:

Кроме того, так как был добавлен новый пользователь, соответствующая запись добавляется в таблицу AspNetUsers.

Таким образом, мы можем воспользоваться преимуществами OWIN и OAuth2 и добавить в приложение идентификацию с помощью внешних сервисов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850