Статьи

OAuth с ASP.NET MVC и WorldDomination. Web.Authentication

Этот пост является продолжением моего предыдущего поста OAuth с NancyFX и WorldDomination.Web.Authentication, за исключением того, что он демонстрирует, как вы можете использовать WorldDomination.Web.Authentication с ASP.NET MVC, в процессе написания только минимального кода.

Чтобы спасти вас от перехода на другой пост, я процитирую себя:

На мой взгляд, одной из самых больших проблем при создании веб-сайтов является реализация OAuth-провайдеров, зачастую это сложно, не работает, а фреймворки, созданные для того, чтобы сделать вещи проще, а не облегчать их.

Поэтому PureKrome и я решили создать WorldDomination: веб-аутентификация

Идея этого фреймворка заключается в том, чтобы внедрить OAuth на свой сайт без лишних хлопот. Базовая структура работает ТОЛЬКО с аутентификацией Google, Twitter и Facebook. Он не пытается создать модный пользовательский интерфейс для вас, он не требует написания большого и большого количества кода. Вы просто даете ему некоторую информацию, он перенаправляет, он возвращается и дает вам информацию аутентификации.

Так что без дальнейших прощаний…

Установка

Установка библиотеки для MVC требует установки специальной библиотеки MVC.

PM> Install-Package WorldDomination.Web.Authentication.Mvc

Это установит:

  • WorldDomination.Web.Authentication.Mvc
  • WorldDomination.Web.Authentication
  • RestSharp

Первый пакет — это поставщик ASP.NET MVC, который соединяет все маршруты и обрабатывает перенаправление и обратный вызов.

Второй пакет является фактической реализацией, он не зависит от NancyContextилиSystem.Web

Последний пакет требуется WorldDomination.Web.Authenticationдля обработки обратного вызова и десериализации ответа.

Настройка

Теперь, когда он установлен, нам нужно его настроить, это можно сделать одним из двух способов: путем добавления информации в web.configили путем регистрации информации вGlobal.asax

Я собираюсь показать web.configпуть, но вы можете посетить вики-сайт github для получения WorldDomination.Web.Authenticationинформации для настройки через Global.asax.

В разделе web.configдобавления конфигурации, как это

<section name="authenticationProviders"
         type="WorldDomination.Web.Authentication.Config.ProviderConfiguration, WorldDomination.Web.Authentication" />

Теперь добавьте authenticationProvidersэлемент.

<authenticationProviders>
  <providers>
    <add name="Facebook" key="470874...41" secret="02bb584...332fe2" />
    <add name="Google" key="58714009...ent.com" secret="npk...ooxCEY" />
    <add name="Twitter" key="Rb7qNNP...znFTbF6Q" secret="pP...7hu9c" />
  </providers>
</authenticationProviders>

Примечание. Это ключ / секрет, который вы получаете при регистрации приложения у провайдеров.

Вы можете получить ключ / секрет, регистрируя ваши приложения:

Регистрация маршрутов

В отличие от Нэнси, мы должны указать Mvc регистрировать маршруты, если вы не возражаете против использования встроенных маршрутов, вы можете просто вызвать регистрацию, передав таблицу маршрутов, и вы получите маршруты по умолчанию, описанные в остальной части этого Сообщение блога.

WorldDominationRouteConfig.RegisterRoutes(RouteTable.Routes);

Зарегистрированные маршруты являются двумя конкретными:

routes.MapRoute(
    name: "WorldDominationAutomatedMvc-Redirect",
    url: "authentication/redirect/{providerkey}/{additionaldata}",
    defaults: new { controller = "WorldDominationAuthentication", action = "RedirectToProvider", additionaldata = UrlParameter.Optional }
);
routes.MapRoute(
    name: "WorldDominationAutomatedMvc-AuthenticateCallback",
    url: "authentication/authenticatecallback",
    defaults: new { controller = "WorldDominationAuthentication", action = "AuthenticateCallback" }
);

В качестве альтернативы, если вы хотите указать свои собственные маршруты, вы можете скопировать указанную выше регистрацию маршрутов и определить свои собственные пути.

Реализация вашего обратного вызова

Теперь вам нужно реализовать обратный вызов, этот обратный вызов — это то, что ВЫ хотите сделать с результатом успешной (или неудачной) аутентификации, вам нужно реализовать это, потому что мы не знаем, что вы запланировали, если вы хотите создать сеанс, установить куки, использовать аутентификацию формы, что угодно, это ваше дело.

Для этого вы можете создать новый класс и реализовать интерфейс IAuthenticationCallbackProvider

public class SampleCallbackProvider : IAuthenticationCallbackProvider
{
    public ActionResult Process(HttpContextBase context, AuthenticateCallbackData model)
    {
        return new ViewResult
        {
            ViewName = "AuthenticateCallback",
            ViewData = new ViewDataDictionary(model)
        };
    }
}

Этот пример просто ответит представлением AuthenticateCallbackи передаст ему модель с данными, возвращенными поставщиком. В идеале вы должны проверить, является ли пользователь новым, или вам нужно добавить его в свою базу данных, или аутентифицировать его в вашей системе.

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

Хотя реализация JabbR предназначена для NancyFX, она даст вам представление о том, чего вы можете достичь. Основное отличие заключается в том, что версия MVC передаст вам HttpContext текущего контроллера, а версия NancyFX — NancyModule. Реализация будет в значительной степени идентична.

Добавление некоторых кнопок

Наконец, вам нужно добавить несколько кнопок на экран. Это где вы должны ссылаться на некоторые конкретные URL.

Примечание. Эти ссылки будут настраиваться в будущем, но пока они жестко запрограммированы.

Два URL-адреса, используемые системой:

  • Redirect: / аутентификация / редирект / ключ провайдера
  • Обратный вызов: / authentication / authenticatecallback? Providerkey = ключ провайдера

Примеры: ссылки, которые вы бы добавили на свою страницу, были бы похожи на:

<a href="/authentication/redirect/Twitter"><img src="/Content/twitter_32.png" /></a>
<a href="/authentication/redirect/Facebook"><img src="/Content/facebook_32.png" /></a>
<a href="/authentication/redirect/Google"><img src="/Content/google_32.png" />

Эти ссылки являются просто обычными гиперссылками, предоставляя вам абсолютную свободу и гибкость в оформлении их по своему желанию. Поскольку мы абсолютно не вовлечены в создание ссылок, мы не можем помешать.

Все, что вам нужно сделать, это убедиться, что предоставленные нам ссылки выглядят так, как указано выше.

Ваши URL обратного вызова в конечном итоге будут выглядеть так:

  • / Аутентификации / authenticatecallback? Providerkey = твиттер
  • / Аутентификации / authenticatecallback? Providerkey = facebook
  • / Аутентификации / authenticatecallback? Providerkey = Google

Примечание . URL-адреса должны быть строчными, потому что Google чувствителен к регистру, поэтому при регистрации приложения в Google убедитесь, что URL-адрес зарегистрирован в нижнем регистре.

И вы сделали!

Теперь вы можете запустить ваше приложение:

Мы нажимаем на Google:

И мы перенаправлены обратно на сайт после разрешения аутентификации с Google:

Это все, что нужно сделать.

Образец можно найти на github здесь:

Вы можете найти исходный код на github:

И пакеты Nuget