Аутентификация Facebook C# SDK – как обрабатывать несколько «приложений» в одном приложении?

StackOverflow https://stackoverflow.com/questions/5494917

Вопрос

У меня есть веб-приложение 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 поэтому я не могу определить тип веб-сайта.

Тем не менее, работает хорошо - довольно СУХО.

Снимаю шляпу перед разработчиками инструментария для использования интерфейса программирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top