表单身份验证忽略默认文档

时间:2010-09-29 19:03:47

标签: asp.net iis-7 forms-authentication

我花了一天半的时间试图解决这个问题。基本上有一个ASP.net网站,使用Framework 4.0在IIS7上进行表单身份验证。

授权内容对于每个场景似乎都是完美的,除了没有指定文档(应该解析为默认文档)。

例如(请不要在现场苛刻它仍然被开发;)), http://www.rewardroster.com/Default.aspx完美无缺,此页面应允许按照web.config中的指定进行匿名访问。

但如果我直接点击www.rewardroster.com,它会重定向到登录页面,返回URL设置为“/”或Login.aspx?ReturnUrl =%2f

我尝试过的一些事情:

1)将身份验证设置为无,然后默认文档工作,这不是问题。

2)将DefaultDocument属性添加到Web.config

3)删除了IIS中默认文档列表中除Default.aspx

以外的所有条目

4)在Config中添加了MachineKey条目

5)从IIS中的集成管道切换到经典管道

以下是我配置中的内容:

  <authentication mode="Forms">
    <forms name="appNameAuth" loginUrl="Login.aspx" protection="All" timeout="60" slidingExpiration="true" defaultUrl="Default.aspx" path="/">
    </forms>
  </authentication>
  </authentication>

 <location path="Default.aspx">

                                 

非常感谢您的时间,并希望有人知道这里发生了什么。

7 个答案:

答案 0 :(得分:38)

这是我的解决方案:

Global.asax,方法:Application_BeginRequest中,放置以下内容:

if (Request.AppRelativeCurrentExecutionFilePath == "~/")  
   HttpContext.Current.RewritePath("HomePage.aspx");

简单明了,如果您的网站根据配置变量使用多个主页,您就有机会围绕要使用的主页构建逻辑。

Dmitry.Alk

答案 1 :(得分:8)

我在尝试点击根路径时遇到了同样的问题,我尝试了之前提到的所有内容。似乎Asp.net 4.0为IIS 7的applicationhost.config添加了两个ExtensionlessUrl模块。您可以通过在web.config中添加以下内容来删除这些模块

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrl-Integrated-4.0"/>
    <remove name=" ExtensionlessUrl-ISAPI-4.0_32bit "/>
  </handlers>
</system.webServer>

其他信息

Microsoft KB

How extensionless urls are handled by asp net v4

答案 2 :(得分:3)

我有类似的问题。我没有登录时没有样式,www.site.nl \重定向到登录页面(带有重定向网址到主页)并输入www.site.nl \ Home(与重定向网址相同的主页)之前)不需要登录。

解决方案是:

  • 打开IIS
  • 打开IIS:身份验证
  • 打开并修改匿名访问
  • 检查用户(我将用户更改为app.pool用户)
  • 授予网站根目录(在文件系统上)
  • 的用户权限

这对我有用。

祝你好运

答案 3 :(得分:3)

我最后要解决的问题是在我的登录页面中编写几行代码来检查“/”的Request.QueryString [“ReturnUrl”]。如果找到了,那么它会重定向到default.aspx。

我找不到任何方法可以在没有指定页面的情况下使表单身份验证不拦截调用(例如www.mysite.com)。 :(我甚至尝试了.NET 4 URL路由,并没有阻止表单身份验证劫持请求。

以下是我在login.aspx中使用的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!(IsPostBack || IsAsync))
    {
        string returnUrl = Request.QueryString["ReturnUrl"];
        if (returnUrl != null)
            if (returnUrl == "/")
                Response.Redirect("default.aspx");
    }
}

答案 4 :(得分:1)

Johan的解决方案对我有用,但前提是请求是针对站点根目录。

我的网站组织如下:

  • 万维网。[mysite的]的.com / login.aspx的
  • 万维网。[mysite的]的.com / Default.aspx的
  • 万维网。[mysite的]的.com / [somestuff] /default.aspx
  • 万维网。[mysite的]的.com / [morestuff] /default.aspx

在遵循Johan的好建议之后,对。[mysite] .com的请求被定向到表单登录页面,并在登录后,默认页面。但是,如果有人要求“/ [somestuff] /”,它仍然无效。

我通过在[somestuff]和[morestuff]目录上启用匿名身份验证,然后在这些目录中的各个文件上禁用它来实现它。这不是我想要支持的安全设置,因为人们可以从default.aspx获取它们的位置,或者只是请求[somestuff] /default.aspx开始。但现在我知道它失败的原因。您似乎需要对要使用默认文档的目录进行匿名访问。

答案 5 :(得分:0)

我今天遇到了类似的问题。我正在尝试使用集成管道来保护nonasp.net资源(静态文件,php等)。

我的根web.config中有一条规则,然后我允许根据具体情况访问特定资源。

除了对“/”的请求永远不会被认证(无休止地重定向到登录页面),而对“/Default.aspx”的请求没问题时,这是有效的。

我的问题是因为为所有资源类型启用了Asp.Net UrlAuthentication模块,显然这对我的方案不起作用。相反,我不得不将该模块更改为仅适用于托管资源,并安装IIS7的非托管URL身份验证。然后我必须配置它(因为它使用不同的身份验证设置),并确保为非托管资源启用了RoleManager(因为我在角色上进行身份验证)。此网址可能会有所帮助:http://learn.iis.net/page.aspx/142/understanding-iis-70-url-authorization/

答案 6 :(得分:0)

我遇到同样的问题并以这种方式解决:

除了Dmitry.Alk解决方案之外,在Global.asax中的

我添加了:

    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~/default.aspx")
        HttpContext.Current.RewritePath("Default.aspx");
    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~/")
        HttpContext.Current.RewritePath("Default.aspx");
    if (Request.AppRelativeCurrentExecutionFilePath.ToLower() == "~")
        HttpContext.Current.RewritePath("Default.aspx");