Аутентификация Facebook C# SDK – как обрабатывать несколько «приложений» в одном приложении?
-
14-11-2019 - |
Вопрос
У меня есть веб-приложение ASP.NET MVC 3, работающее с Facebook C# SDK.
Следуя инструкциям здесь, кажется, что как только вы указали AppId/Secret в разделе веб-конфигурации, это означает, что настройки возвращаются при использовании FacebookApplication.Current
, например:
var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current)
{
RedirectUri = new Uri(RedirectUrl)
};
Мое веб-приложение имеет «белую маркировку», поэтому оно обслуживает два веб-сайта с двумя отдельными приложениями Facebook.
Раньше, когда я реализовал Facebook Connect, у меня было глобальное свойство под названием «FacebookApplicationId», которое просматривало домен и определяло, какой идентификатор приложения использовать.
Есть ли изящный способ сделать это с помощью Facebook C# SDK?
Я мог бы просто сделать это:
var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current)
{
RedirectUri = new Uri(RedirectUrl),
AppId = ManuallyGetTheRightAppIdBasedOnDomain(),
AppSecret = ManuallyGetTheRightAppSecretBasedOnDomain()
};
Но это кажется неСУХИМ, поскольку мне придется продолжать это делать.
Есть ли способ добавить немного ума? FacebookApplication.Current
, таким образом AppId
и AppSecret
свойства уже установлены?
Открыт для любых предложений.
Решение
Думаю, я понял:актер для FacebookOAuthClient
берет IFacebookApplication
.
Итак, я создал конкретную реализацию под названием WhiteLabeledFacebookApplication
, который реализует IFacebookApplication
.
WhiteLabeledFacebookApplication
актер берет WebsiteType
enum, поэтому свойства для AppId
и AppSecret
прочитайте соответствующие значения из web.config на основе перечисления, переданного в ctor.
Итак, в моем FacebookController
, (где я занимаюсь всеми делами на ФБ), у меня есть частная собственность под названием CurrentFacebookApplication
:
private IFacebookApplication _currentFacebookApplication;
private IFacebookApplication CurrentFacebookApplication
{
get
{
if (_currentFacebookApplication == null)
{
var websiteType = SomeUnimportantCodeWhichWorksOutWebsiteFromUrl();
_currentFacebookApplication = new WhiteLabeledFacebookApplication(websiteType );
}
return _currentFacebookApplication;
}
}
Итак, я могу сделать это:
var oAuthClient = new FacebookOAuthClient(CurrentFacebookApplication)
{
RedirectUri = new Uri(RedirectUrl)
};
И правильный AppId/Secret будет возвращен — отлично!
Единственное, что мне хотелось бы сделать, это использовать внедрение зависимостей, но при создании контроллеров нет HttpContext
поэтому я не могу определить тип веб-сайта.
Тем не менее, работает хорошо - довольно СУХО.
Снимаю шляпу перед разработчиками инструментария для использования интерфейса программирования.