虚拟应用程序中忽略表单身份验

时间:2010-03-15 12:49:02

标签: asp.net iis forms-authentication virtual-directory

我将管理网站设置为另一个网站内的虚拟应用程序。

我希望使用在主父网站上设置的相同Forms身份验证来提升子目录(虚拟应用程序)的访问者的凭据

尝试了各种各样的事情,但无法让它发挥作用,包括

从虚拟应用web.config中删除所有<authentication mode="Forms"><authorization><membership><roles>部分

将父级中的相同<authentication mode="Forms"><authorization><membership><roles>部分复制到虚拟应用程序web.config

使用虚拟目录而不是虚拟应用程序

但我永远不会获得凭证

任何人都知道如何进行此设置?

感谢

更新:

现在已经通过删除IIS中的应用程序名称(使其成为虚拟目录而不是虚拟应用程序)来继承父项的权限。

但是,这会破坏管理站点中的所有路径

e.g。我收到以下错误

文件'/Site.master'不存在。

我应该使用虚拟目录(它似乎是从父级继承身份验证)?

或虚拟应用程序(当前不从父级继承auth但具有正确的相对路径)?

这是父配置

<membership defaultProvider="SqlServerMembershipProvider">
            <providers>
                <add connectionStringName="xxxxxxxx" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="SqlServerMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
        </membership>
        <roleManager enabled="true" defaultProvider="SqlServerRoleProvider">
            <providers>
                <add connectionStringName="xxxxxxx" applicationName="/" name="SqlServerRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
        </roleManager>

        <authentication mode="Forms">
            <forms name=".EPiServerLogin" loginUrl="login.aspx" timeout="120"/>
        </authentication>
        <authorization>
            <deny users="?"/>
        </authorization>

3 个答案:

答案 0 :(得分:2)

我需要在解决方案上使用单点登录,如此处所述

http://www.codeproject.com/KB/aspnet/SingleSignon.aspx

重点是,每个站点都需要为cookie值使用相同的加密密钥。因此,需要将此machineKey元素添加到单点登录中涉及的每个站点

答案 1 :(得分:1)

你是如何configured authorization的?

另外,我假设您尚未在父网站中进行身份验证?

在admin子目录中,你的web.config中应该包含以下内容(显然你可能还有更多信息):

<configuration>
  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</configuration>

这将拒绝所有匿名用户,但允许所有经过身份验证的用户访问。如果您使用角色提供程序仅允许某些角色,则可以轻松扩展此功能:

      <allow roles="Admin" />
      <deny users="*" />

请注意,您需要“拒绝所有用户”,因为默认行为是允许所有用户。授权工作“自上而下”,因为它从列表的顶部开始,一旦找到匹配,它就会停止处理,因此如果用户处于“管理员”角色,它将无法进入“拒绝”所有用户“统治。

您也可以使用<location> element在根web.config中配置它。

回复评论

您的身份验证/授权是否都在父站点中运行?

您是否可以编辑您的问题以包含您已尝试过的(已消毒的)web.config部分,以便我们可以查看是否有任何明显缺失的内容 - 例如,如果您使用角色锁定管理区域,则已启用它(<roleManager enabled="true">,默认为false)。

答案 2 :(得分:0)

我们经常在这里做你想做的事。

我们这样做:根级别是一个虚拟应用程序,它包含主web.config和global.ascx。我们有一个普通的文件夹,'Admin'。在其中,我们有一个小的web.config,它只包含<authorization> XML信息。你需要一个登录页面,root或Admin文件夹。

关于是否涉及三个应用程序/目录(应用程序,父应用程序,应用程序的管理员)或仅有两个(应用程序和管理员),我在您的帖子中有点困惑。我在这里做了一个关键的假设,它是两个。如果你确实拥有这三个,那么这项工作将会有更多的工作。

alt text http://i42.tinypic.com/t5j028.png