Этот пост является продолжением моего предыдущего поста 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>
Примечание. Это ключ / секрет, который вы получаете при регистрации приложения у провайдеров.
Вы можете получить ключ / секрет, регистрируя ваши приложения:
- Facebook: http://developers.facebook.com/docs/howtos/login/server-side-login/
- Twitter: https://dev.twitter.com/
- Google: https://code.google.com/apis/console/?pli=1#access
Регистрация маршрутов
В отличие от Нэнси, мы должны указать 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