Интеграция Dynamics CRM с Sharepoint ASCX SecurityException Проблема - PullRequest
1 голос
/ 09 апреля 2010

У меня есть элемент управления ASCX (в этом решении веб-части не используются), который запрашивает данные CRM 4 через API, предоставляемый Microsoft.Crm.Sdk и Microsoft.Crm.SdkTypeProxy.

Решение работает, пока не будет развернуто на Sharepoint.

Изначально я получил следующую ошибку:

[SecurityException: That assembly does not allow partially trusted callers.]
   MyApp.SharePoint.Web.Applications.MyAppUtilities.RefreshUserFromCrm(String login) +0
   MyApp.SharePoint.Web.Applications.MyApp_LoginForm.btnLogin_Click(Object sender, EventArgs e) +30
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111

Затем я попытался обернуть вызывающий код в ASCX с помощью SPSecurity.RunWithElevatedPrivileges:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
   // FBA user may not exist yet or require refreshing
   MyAppUtilities.RefreshUserFromCrm(txtUser.Text);
});

Но это привело к следующей ошибке (я думаю, что RunWithElevatedPrivileges не для такого рода вещей, но кто-то предложил):

[SecurityException: Request for the permission of type 'Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' failed.]
   MyApp.SharePoint.Web.Applications.MyApp_LoginForm.btnLogin_Click(Object sender, EventArgs e) +0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111

Когда я поднимаю уровень доверия на сайте Sharepoint до полного, все работает нормально, однако мне нужно найти решение, которое использует минимальное доверие (или настроенное минимальное доверие). Я также пытаюсь избежать добавления чего-либо в GAC. Есть идеи?

Я предполагаю, что проблема возникает при попытке вызвать функцию из Microsoft.Crm.*.

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Я бы использовал GAC.

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

Добавьте следующее в manifest.xml вашего пакета решений:

<Assemblies>
    <Assembly Location="MyApp.SharePoint.Web.Applications.dll" DeploymentTarget="GlobalAssemblyCache" />
</Assemblies>

А затем разверните ваш пакет, используя:

stsadm.exe -o deploysolution -name MyApp.wsp -immediate -allowgacdeployment -force

Если вы все еще хотите остаться вне GAC, вы можете попробовать добавить следующее в AssemblyInfo.cs:

[assembly: AllowPartiallyTrustedCallers]

Но если вы собираетесь вызывать библиотеки DLL (например, Microsoft.Crm), и если эти библиотеки DLL не поддерживают частично доверенные программы вызова, вы застряли.

Кроме того, если вы еще этого не сделали, вам, вероятно, потребуется создать файл пользовательской политики . Это было ручное создание и регистрация файла пользовательской политики, который предоставлял слишком широкие привилегии, что окончательно убедило меня перейти в GAC. С тех пор не оглядывался назад.

0 голосов
/ 09 апреля 2010

Какой метод из Microsoft.Crm.Sdk точно генерирует исключение SecurityException? Проверьте MSDN и посмотрите, какие разрешения ему нужно вызывать.

Что касается RunWithElevatedPrivileges, из документации видно, что ей нужно

[SharePointPermissionAttribute(SecurityAction.Demand, Impersonate=true)] 
[SharePointPermissionAttribute(SecurityAction.Demand, ObjectModel=true)] 

И пользователь в комментариях предоставил пример набора разрешений CAS для включения этих разрешений:

<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="Assertion, Execution, ControlThread, ControlPrincipal, RemotingConfiguration, UnmanagedCode" />
<IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" ObjectModel="True" Impersonate="True" UnsafeSaveOnGet="True"/>

В противном случае у вас нет необходимых прав для вызова кода, если сборка не является полностью доверенной. То же самое, вероятно, идет с некоторым методом из Microsoft.Crm.Sdk

...