ASP.NET重定向到登录页,但不重定向到默认页

ASP.NET重定向到登录页,但不重定向到默认页,asp.net,web-config,Asp.net,Web Config,我有一个ASP.NET 4.5/C站点,我正在尝试做以下工作。当用户访问站点的根目录时,他们应该被重定向到Default.aspx。此页面已打开,不需要登录。如果他们想登录,此页面上有一个链接。但是,如果他们试图访问其他页面,我需要自动将他们重定向到登录。有些是向所有人开放的,有些则不是。我很喜欢通过每个页面或每个文件夹的角色分配权限。我遇到的问题是Default.aspx 如果用户通过键入:进入我的站点,那么页面将显示没有登录重定向的页面 如果用户通过键入:来我的站点,那么他们将被重定向到登录

我有一个ASP.NET 4.5/C站点,我正在尝试做以下工作。当用户访问站点的根目录时,他们应该被重定向到Default.aspx。此页面已打开,不需要登录。如果他们想登录,此页面上有一个链接。但是,如果他们试图访问其他页面,我需要自动将他们重定向到登录。有些是向所有人开放的,有些则不是。我很喜欢通过每个页面或每个文件夹的角色分配权限。我遇到的问题是Default.aspx

如果用户通过键入:进入我的站点,那么页面将显示没有登录重定向的页面

如果用户通过键入:来我的站点,那么他们将被重定向到登录

到目前为止我的生活还不错,但是

如果用户通过键入:来我的站点,那么他们将被重定向到登录,而不仅仅是加载Default.aspx。下面是相关的web.config

<location path="Default.aspx">
  <system.web>
    <authorization>        
      <allow users="?"/>
    </authorization>
  </system.web>
</location>
<system.web>  
  <authentication mode="Forms">
    <forms name=".ASPXFORMSAUTH" loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" requireSSL="false" protection="All" slidingExpiration="true" path="/" timeout="240"  cookieless="UseDeviceProfile" enableCrossAppRedirects="false" />     
  </authentication>
  <authorization>
    <deny users= "?"/>
  </authorization>
<system.web>

一如既往,谢谢

更新

我已将所有内容移动到3个目录中的一个:\u public、\u private、\u admin。让我们暂时不要担心管理员。下面是my web.config的设置方式:

<defaultDocument>
  <files>
    <clear />
    <add value="~/_public/Default.aspx" />
  </files>
</defaultDocument>
.
.
.
<location path="_public">
  <system.web>
    <authorization>        
      <allow users="?"/>
    </authorization>
  </system.web>
</location>
<location path="_private">
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>
.
.
.
<forms name=".ASPXFORMSAUTH" loginUrl="~/_public/Login.aspx" defaultUrl="~/_private/landingPage.aspx" slidingExpiration="true" path="/" />

? 现在它告诉我没有指定默认页面

另外,关于forms标记的defaultUrl属性。这与我的登录控件的DestinationPageUrl有何关联

谢谢

更新
我将位置标记中的路径更新为“~/folder”,而不是“folder”。现在不是一个错误,而是一直把我带到登录屏幕。我在web.config的根目录中没有另一个授权标记,但我正在处理主web.config中的子文件夹,而不是在每个子文件夹中放置一个单独的文件。

我建议创建一个登录页,该页将是用户键入根URL的结果

您看到的问题是,
default.aspx
是IIS中根URL请求的默认文档,也是表单身份验证的
defaultUrl

创建一个
Landing.aspx
页面,其中包含您想要的任何消息、登录链接等

现在,将此
Landing.aspx
作为IIS中的第一个默认文档(确保它位于列表中
default.aspx
之前),这样根URL请求将重定向到
Landing.aspx
,而根本不涉及表单身份验证

另外,在
web.config
中添加
条目,以允许所有用户访问
Landing.aspx
页面:

<location path="Landing.aspx">
    <system.web>
        <authorization>        
            <allow users="?"/>
        </authorization>
    </system.web>
</location>

如果要将用户限制在文件夹中,则需要在每个文件夹中创建*web.config*s(这比在主web.config中添加所有内容要容易得多)

注意:为了获得良好的设计实践(在传统的ASP.Net中),您需要将Admin.aspx放在一个单独的文件夹中。对于需要登录的用户页面也一样。

这里有一个例子-

Main web.config

Users/web.config 拒绝匿名访问。换句话说,用户需要在访问用户文件夹中的任何页面之前登录

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

Admin/web.config 拒绝除管理员角色的用户以外的所有人

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authorization>
      <allow roles="Administrator" />
      <deny users="*"/>
    </authorization>
  </system.web>
</configuration>

尝试以下操作:

  • 创建一个文件夹,例如admin,并将Login.aspx放在那里
  • 将身份验证设置为窗体

    <authentication mode="Forms">
    <forms name="HIVLogin" loginUrl="~/admin/Login.aspx" timeout="20" protection="All"/>
    </authentication>
    
    
    
  • 然后在system.web下

    <location path="Admin">
    <system.web>
      <authorization>
        <allow roles="Admin" />
        <allow users="Admin" />
       <deny users="*" />
      </authorization>
    </system.web>
    
    
    


  • 谢谢大家的详细答复。他们都很有帮助,让我找到了更好的整体解决方案。然而,我的问题的根源是一些非常小和恼人的事情。再次查看我的默认页面:

    <defaultDocument>
      <files>
        <clear />
        <add value="~/_public/Default.aspx" />
      </files>
    </defaultDocument>
    
    
    
    请注意值中的路径。我对此进行了实验,发现如果我以波浪形或正斜杠开头,这个值就会被完全忽略。一旦我将它指定为“\u public/Default.aspx”,其他的一切都正常工作了

    不过我确实改变了一些事情。我使用三个子文件夹作为页面:_public、_private和_admin_public适用于任何人,_private适用于任何经过身份验证的人,_admin适用于具有特殊权限的人。我想说的是,我的网站根目录中没有任何Default.aspx文件。为了验证我在web.config中指定路径的方式是否错误,我尝试将其切换回原来的路径,但失败完全相同

    我很好奇是否有人发现了这一点,你认为这是不一致的吗?在我的web.config中的大多数其他地方,我都可以通过以波浪号开头的方式从根指定路径


    所以,我的网站按预期运行…匿名用户访问公共页面效果很好。点击私人或管理页面将重定向到登录。登录后,如果您试图进入特定页面,您将进入该页面……如果没有,则会通过forms标记中的defaulturl重定向您。最重要的是,当您键入没有指定页面的站点名称时,您将进入默认页面…如果不是因为语法问题,这应该是最简单的部分。原来是这样……啊

    在ASP.NET中将页面设置为默认页面不需要编写任何代码。进入解决方案资源管理器,右键单击要设置为默认值的页面,然后单击设置为起始页面

    您需要在部分
    下添加以下映射

    
    
    当您浏览根url(即www.domain.com或localhost)时,这将重定向到default.aspx


    谢谢。

    我花了大约6个小时调试这个问题。我们的网站运行正常,突然它开始重定向到登录页面而不是默认页面(未经验证)。我们的web.config正确地包含了所有身份验证/授权设置

        <authentication mode="Forms">
          <forms name="MyAuth" path="/" loginUrl="login.aspx" protection="All" timeout="30" />
        </authentication>
        <authorization>
          <deny users="?" />
        </authorization>
    
      <system.webServer>
        <defaultDocument>
          <files>
            <clear />
            <add value="default.htm" />
          </files>
        </defaultDocument>
    ...
      </system.webServer>
    
      <location path="default.htm">
        <system.web>
          <authorization>
            <allow users="?" />
          </authorization>
        </system.web>
      </location>
    ...
    
    SOLUTION: You need to remove Extensionless URL feature from your website. Ref: https://support.microsoft.com/en-us/help/2526854/users-may-be-redirected-to-the-login-page-of-an-asp-net-4-application
    
    <system.webServer>
    
         <handlers>
              <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
              <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
              <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
         </handlers>
    
         <validation validateIntegratedModeConfiguration="false" />
    
    </system.webServer>
    
    
    ...
    
    <urlMappings enabled="true">
        <add url="~/" mappedUrl="~/Default.aspx" />
    </urlMappings>
    
        <authentication mode="Forms">
          <forms name="MyAuth" path="/" loginUrl="login.aspx" protection="All" timeout="30" />
        </authentication>
        <authorization>
          <deny users="?" />
        </authorization>
    
      <system.webServer>
        <defaultDocument>
          <files>
            <clear />
            <add value="default.htm" />
          </files>
        </defaultDocument>
    ...
      </system.webServer>
    
      <location path="default.htm">
        <system.web>
          <authorization>
            <allow users="?" />
          </authorization>
        </system.web>
      </location>
    ...
    
    SOLUTION: You need to remove Extensionless URL feature from your website. Ref: https://support.microsoft.com/en-us/help/2526854/users-may-be-redirected-to-the-login-page-of-an-asp-net-4-application
    
    <system.webServer>
    
         <handlers>
              <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
              <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
              <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
         </handlers>
    
         <validation validateIntegratedModeConfiguration="false" />
    
    </system.webServer>