1

我有一个 ASCX 控件(此解决方案中不使用 WebParts),它通过Microsoft.Crm.Sdk和提供的 API 询问 CRM 4 的数据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

然后我尝试使用 SPSecurity.RunWithElevatedPrivileges 将调用代码包装在 ASCX 中:

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.*.

4

2 回答 2

1

我会使用 GAC。

我明白你来自哪里。当我第一次开始进行 SharePoint 开发时,我试图避免使用 GAC。但这确实是要走的路。

将以下内容添加到解决方案包的 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。从此再也没有回头。

于 2010-04-14T17:25:37.997 回答
0

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 的某些方法可能也是如此

于 2010-04-09T06:29:17.900 回答