我有一个ASCX控件(此解决方案中未使用WebParts),它通过Microsoft.Crm.Sdk
和Microsoft.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.*
调用功能时会出现问题。
答案 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
中的某些方法也是如此