FacebookSDK - проблема AllowPartiallyTrustedCallers - PullRequest
1 голос
/ 18 ноября 2010

Я использую последнюю версию FacebookSDK (4.0.2) (facebooksdk.codeplex.com)

И я заметил, что код Src состоит из нескольких проектов, а именно:

1)

Образцы -> Facebook.Samples.AspWebsite ProjectОбразцы -> Facebook.Samples.MvcFacebookApp ProjectОбразцы -> Facebook.Samples.MvcWebsite Project

2)

Тесты -> Facebook.TestsТесты -> Facebook.Web.Tests

3)

Проект FacebookПроект Facebook.WebПроект Facebook.Web.Mvc

Итак, я создаю приложение Facebook Canvas .Net 4.0 MVC 2 и просто использую проект Facebook.Samples.MvcFacebookApp и заменяю и добавляю классы и файлы, как мне кажется, подходящим для моей ситуации.Однако я дошел до того, что мой сайт будет работать в облаке Microsoft Azure, и я хочу абстрагировать слой данных (базу данных) в свой проект.Поэтому я решил создать новый проект в решении BusinessData и добавил к нему EntityDataModel, поэтому теперь решение выглядит так:

1)

Samples -> Facebook.Samples...

2)

Тесты -> Facebook.Tests ...

3)

Facebook ProjectПроект Facebook.WebПроект Facebook.Web.MvcBusinessData Project-> Business.edmx

Отлично, теперь я добавляю ссылку на проект BusinessData в свой проект Facebook.Samples.MvcFacebookApp и пытаюсь получить доступ к моей базе данных.Тем не менее, я получаю эту ошибку в своем классе TrackUserAttribute.cs в проекте Facebook.Samples.MvcFacebookApp:


System.MethodAccessException occurred
  Message=Attempt by security transparent method 'Facebook.Samples.MvcFacebookApp.Models.TrackUserAttribute..ctor()' to access security critical method 'BusinessData.BusinessEntities..ctor()' failed.

Assembly 'Facebook.Samples.MvcFacebookApp, Version=4.0.2.0, Culture=neutral, PublicKeyToken=null' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model.  Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.
  Source=Facebook.Samples.MvcFacebookApp
  StackTrace:
       at Facebook.Samples.MvcFacebookApp.Models.TrackUserAttribute..ctor() in C:\Users\rkara\Desktop\FacebookPazooza\ThuziFacebookSDK\Source\Src\Facebook.Samples.MvcFacebookApp\Models\TrackUserAttribute.cs:line 13
  InnerException:

После некоторого беспрецедентного исследования и неполного понимания политики CAS и ее развития в ASP.NetНасколько я понимаю, файл GlobalAssemblyInfo.cs, содержащийся во всех проектах решения FacebookSDK, как-то связан с ним.

Эта строка кода в файле GlobalAssemblyInfo.cs:

<code>
#if !(SILVERLIGHT || TESTS)
[assembly: AllowPartiallyTrustedCallers]
#endif

кажется виновником.По словам этого эксперта Microsoft:

http://www.simple -talk.com / dotnet / .net-framework / что нового в коде безопасности доступа в .net-framework-4.0--- part-i /

BusinessData имеет привилегии уровня SecurityCritical.Мой класс TrackUserAttribute.cs имеет только SecurityTransparent, поэтому не может не иметь привилегий для вызова методов в сборке BusinessData.Это правильно?

Я пробовал все виды вещей, чтобы заставить эту вещь работать, даже удаляя [assembly: AllowPartiallyTrustedCallers] из файла GlobalAssemblyInfo.cs, но у меня возникает другая проблема с самим файлом .edmx, говоряон не может загрузить метаданные, поэтому я предполагаю, что он все еще имеет отношение к полному доверию и т. д.

Я уверен, что на этот вопрос есть простой ответ, и я уверен, что ребята, которые разработали эту оболочку SDK,Я должен учитывать тот факт, что люди будут расширять свой SDK в соответствии с индивидуальными потребностями.

Каков наилучший подход для меня, чтобы обеспечить абстрагирование моих данных и всего, что я хочу абстрагировать, без необходимости связывать их с проектамипредоставлено?

На данный момент, чтобы продолжить разработку и не связываться с этим слишком долго, я просто сохранил свою модель сущности (edmx) в папке моделей на Facebook.Samples.MvcFacebookApp.Пока это работает, но я бы предпочел хранить edmx в своем собственном проекте.

Cheers Rob

1 Ответ

1 голос
/ 18 ноября 2010

Хорошо, так что после того, как я оставил эту проблему и перешел на установку log4net в качестве регистратора событий для своего приложения, я наткнулся на этот сайт:

http://it.toolbox.com/blogs/daniel-at-work/using-log4net-in-cnet-26794

По сути, я хотел преобразовать log4net вasp.net 4.0, а не 1.0 / 2.0, в котором он был изначально написан. Затем, прочитав инструкции этого парня о том, как он заставил старый код log4net работать в 4.0, ага!момент наступилПо сути, все, что ему нужно было сделать, это поместить этот атрибут в его файл AssemblyInfo.cs:

[assembly: AllowPartiallyTrustedCallers]

Поэтому я сделал то же самое для своего проекта BusinessData и обновил AssemblyInfo.cs.файл там, и эй до того, как это сработало!

После некоторых глубоких размышлений я решил, что это позволило моим частичным привилегиям Facebook.Samples.MvcFacebookApp вызвать сборку SecurityCritical, включая те объекты, которые в ней содержатся.Таким образом, я мог бы пойти дальше и вызвать мой edmx (EntityDataModel) в этой сборке из приложения Mvc.

Второе исправление, и не до конца известно, почему это необходимо, но оно устраняет проблему, состоящую в копировании строки подключения.из файла App.config в файл Web.config в приложении Mvc.По какой-то причине edmx пытался читать из файла web.config вместо App.config для строки подключения.Так что теперь у меня есть та же строка подключения в файле App.config и Web.config.

Мех!это работает, и я счастлив ... двигаться дальше!

: - D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...