1

Microsoft.Crm.Sdkおよびによって提供されるAPIを介してCRM4のデータを問い合わせるASCXコントロール(このソリューションではWebパーツは使用されません)があり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.*

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 に答える