将Dynamics CRM与Sharepoint ASCX SecurityException问题集成

时间:2010-04-09 02:24:35

标签: c# asp.net security sharepoint crm

我有一个ASCX控件(此解决方案中未使用WebParts),它通过Microsoft.Crm.SdkMicrosoft.Crm.SdkTypeProxy提供的API查询CRM 4的数据。

解决方案一直有效,直到它部署到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.*调用功能时会出现问题。

2 个答案:

答案 0 :(得分: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不允许部分受信任的调用者,那么你就会陷入困境。

此外,如果您还没有,则可能需要create a custom policy file。这是一个自定义策略文件的手动创建和注册,它授予的权限过于宽泛,最终说服我转移到GAC。从那以后一直没有回头。

答案 1 :(得分:0)

Microsoft.Crm.Sdk中的哪个方法会引发SecurityException?检查MSDN并查看需要调用的权限。

关于RunWithElevatedPrivileges,您可以从documentation看到它需要

[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

中的某些方法也是如此