2

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

该网站在完全信任的情况下工作。但是,将信任设置为中等后,我System.Security.SecurityException: Request failed. 一浏览该站点就会收到错误消息。

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

该站点能否以中等信任度运行,还是我必须完全信任所有 LDAP 调用?

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

[在 Win2k8R2 上运行 .NET 4.0]

4

2 回答 2

4

LogOnUser与所有 P/Invoke 调用一样,需要SecurityPermission使用UnmanagedCode权限标志。System.DirectoryServices.AccountManagement要求不受限制DirectoryServicesPermission。默认情况下,这两种权限都不会授予中等信任的 ASP.NET 应用程序。

AllowPartiallyTrustedCallers属性允许部分信任程序集使用完全信任程序集。在您的情况下,该属性无效,因为 bin 文件夹中的所有程序集都加载到部分信任应用程序域中。

如果您的应用程序需要在中等信任下运行,并且您有能力将程序集安装到 GAC 中,那么您可以创建一个包含需要额外权限的代码的程序集,用 标记该程序集AllowPartiallyTrustedCallers并将其放入 GAC。您还需要Assert所需的权限来抑制仍会发生的堆栈遍历。

有关详细信息,请参阅MSDN 库中的 ASP.NET 4 应用程序中的代码访问安全性主题。

于 2012-06-05T14:32:29.243 回答
0

虽然@Michael Liu 的回答是正确的,但对于在这方面工作知识有限的新手(比如我自己)来说并不容易理解。该答案旨在补充迈克尔的答案。

当您的 web.config 配置为使用“完整”以外的任何信任级别时

<trust level="Full"/>

如果不创建自己的策略文件,您将无法连接到 Active Directory 。一旦您创建了自己的策略文件(假设它被称为“myPolicyFile.config”),那么您就可以对其进行自定义以允许您的 ASP.NET 应用程序连接到 Active Directory。

以下是您需要进行的更改:

在 web.config 中,将网站配置为使用您的自定义策略文件:

<system.web>
    ...
    <securityPolicy>
        <trustLevel name="myMediumPolicy" policyFile="myPolicyFile.config"/>
    </securityPolicy>

    <trust level="myMediumPolicy"/>
    ...
</system.web>

接下来,在 myPolicyFile.config 文件中,添加“SecurityClass”和“IPermission”条目,如下所示:

<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>

注意: <IPermission class="SecurityPermission"... /> 节点可能已经存在(取决于您基于 myPolicyFile.config 文件的系统定义的信任级别文件)。如果它已经存在,那么您只需将文本“, UnmanagedCode”添加到“Flags”属性。如果它不存在,则将上面的示例复制并粘贴到“ASP.Net”NamedPermissionSet 中。

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

于 2015-02-25T23:40:28.380 回答