中等信任的LDAP

时间:2012-05-31 19:39:47

标签: asp.net interop directoryservices medium-trust

我有一个网站和几个项目的解决方案 这些项目都具有AllowPartiallyTrustedCallers属性,并且具有强名称。

该网站完全信任。但是,在将信任设置为中等后,我会在浏览到该网站后立即收到System.Security.SecurityException: Request failed. 错误。

在我的项目中,我调用LogOnUser,以及调用各种System.DirectoryServices.AccountManagement方法。

此网站可以以中等信任方式运行,还是必须完全信任所有LDAP呼叫?

正如我所提到的,我在所有项目中都设置了AllowPartiallyTrustedCallers属性。不知道还能做什么。
此外,我不知道错误的产生位置/位置。服务器上的事件日志与此SecurityException无关。有没有办法找出错误位置是什么,所以也许我可以尝试重写一些代码?

[在Win2k8R2上运行.NET 4.0]

2 个答案:

答案 0 :(得分:4)

与所有P / Invoke调用一样,

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。

最后,保存更改并重新加载您的网站。你应该好好去!