我有一个网站和几个项目的解决方案
这些项目都具有AllowPartiallyTrustedCallers
属性,并且具有强名称。
该网站完全信任。但是,在将信任设置为中等后,我会在浏览到该网站后立即收到System.Security.SecurityException: Request failed.
错误。
在我的项目中,我调用LogOnUser
,以及调用各种System.DirectoryServices.AccountManagement
方法。
此网站可以以中等信任方式运行,还是必须完全信任所有LDAP呼叫?
正如我所提到的,我在所有项目中都设置了AllowPartiallyTrustedCallers
属性。不知道还能做什么。
此外,我不知道错误的产生位置/位置。服务器上的事件日志与此SecurityException无关。有没有办法找出错误位置是什么,所以也许我可以尝试重写一些代码?
[在Win2k8R2上运行.NET 4.0]
答案 0 :(得分:4)
LogOnUser
需要SecurityPermission
UnmanagedCode
权限标记。 System.DirectoryServices.AccountManagement
要求不受限制DirectoryServicesPermission
。默认情况下,不会向中等信任的ASP.NET应用程序授予权限。
AllowPartiallyTrustedCallers
属性允许部分信任程序集使用完全信任程序集。在您的情况下,该属性无效,因为bin文件夹中的所有程序集都已加载到部分信任应用程序域中。
如果您的应用程序需要在中等信任下运行,并且您能够将程序集安装到GAC中,那么您可以创建一个包含需要额外权限的代码的程序集,使用AllowPartiallyTrustedCallers
标记程序集,并将其放入GAC。您还需要Assert
所需的权限来抑制仍将发生的堆栈遍历。
有关详细信息,请参阅MSDN Library中的Code Access Security in ASP.NET 4 Applications主题。
答案 1 :(得分:0)
虽然@Michael Liu的答案是正确的,但在这方面工作知识有限的新手(例如我自己)并不容易理解。这个答案旨在补充迈克尔的答案。
当您的web.config配置为使用以外的任何"完整"
的信任级别时<trust level="Full"/>
然后,如果没有creating your own policy file,您将无法连接到Active Directory。一旦你创建了自己的策略文件(让我们称之为&#34; myPolicyFile.config&#34;),你就可以自定义它了以便允许你的ASP.NET用于连接到Active Directory的应用程序。
以下是您需要进行的更改:
在web.config中,将网站配置为使用自定义策略文件:
<system.web>
...
<securityPolicy>
<trustLevel name="myMediumPolicy" policyFile="myPolicyFile.config"/>
</securityPolicy>
<trust level="myMediumPolicy"/>
...
</system.web>
接下来,在myPolicyFile.config文件中,添加&#34; SecurityClass&#34;和&#34; IPermission&#34;条目如下所示:
<configuration>
...
<PolicyLevel version="1">
<SecurityClasses>
....
<SecurityClass Name="DirectoryServicesPermission" Description="System.DirectoryServices.DirectoryServicesPermission, System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
....
</SecurityClasses>
<NamedPermissionSets>
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="ASP.Net">
...
<IPermission
class="DirectoryServicesPermission"
version="1"
Unrestricted="true"
/>
<IPermission
class="SecurityPermission"
version="1"
Flags="Execution, ControlThread, ControlPrincipal, RemotingConfiguration, UnmanagedCode"
/>
...
</PermissionSet>
</NamedPermissionSets>
</PolicyLevel>
...
</configuration>
注意:&lt; IPermission class =&#34; SecurityPermission&#34; ... /&gt;节点可能已经存在(取决于您基于myPolicyFile.config文件的系统定义的信任级别文件)。如果它已经存在,那么你只需要添加文本&#34;,UnmanagedCode&#34;到了#34; Flags&#34;属性。如果它尚不存在,则将上面的示例复制并粘贴到&#34; ASP.Net&#34; NamedPermissionSet。
最后,保存更改并重新加载您的网站。你应该好好去!