重定向Windows身份验证到自定义401页面

5
我们正在将一些以前在表单身份验证下运行的Web应用程序转换为现在以Windows身份验证运行。我希望最小修改实际页面即可重新创建具有表单身份验证的页面安全性。我能够用简化的Web应用程序重新创建我想要的效果。我正在运行基于Server 2008 R2集成管道的IIS 7.5上的应用程序。
我创建了一个使用Windows身份验证的简单的三页应用程序。这三个页面是:
- Openpage.aspx,对任何经过身份验证的用户开放 - Blockedpage.aspx,对所有用户都被阻止访问(象征着基于用户角色将被阻止访问的目录或页面的子集) - ErrorPage.aspx,如果访问Blockedpage.aspx(并被拒绝),应用程序应该转发到ErrorPage.aspx,用户可以获得有关应用程序的通用信息。
应用程序的Web.Config如下:
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
      <authentication mode="Windows"/>
      <authorization>
        <deny users="?" />
        <allow users="*" />
      </authorization>
    </system.web>
  <location path="blockedpage.aspx">
    <system.web>
      <authorization>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
  <system.webServer>
   <httpErrors errorMode="Custom" >
      <remove statusCode="401" subStatusCode="-1" />
      <error statusCode="401" path="/development/simplesecurityapp/errorpage.aspx" responseMode="ExecuteURL" />
    </httpErrors>

    <validation validateIntegratedModeConfiguration="false" />
    <defaultDocument>
      <files>
        <clear />
        <add value="openpage.aspx" />
      </files>
    </defaultDocument>
  </system.webServer>

</configuration>

如果我不尝试在asp.net级别重定向401错误,我只会得到标准的“未经授权的消息”,这不是我想要给我的用户的效果。

然而,我遇到了一个我不理解的错误-每次服务器重置时,应用程序就停止工作。IIS仅返回401错误,直到浏览器弹出手动登录控件,无法满足该控件。(我永远不希望我的用户被呈现浏览器登录提示)

但是,如果我替换httperrors部分,一旦应用程序设置好(通过编辑web config或使用服务器GUI更新它)删除该部分,访问该页面,然后添加该部分回来,该应用程序开始按预期工作,并继续工作,直到服务器重新启动,此时它又开始给用户显示手动登录弹窗,他们无法解决。

1)这是使用Windows身份验证保护应用程序的正确方法吗(是否有更好的方法配置目录不可访问,但仍提供自定义错误页?)

2)这是集成管道的影响吗,为什么会这样工作?

1个回答

1

你试图在传输错误信息中提供内容。

Forms可以做到这一点,因为它由第7层的东西组成,例如302和200。 401被客户端浏览器解释为“服务器不喜欢我的凭据,所以提出对话框要求新的凭据”。

已验证的页面至少产生1个401以进行身份验证;您正在将“错误”超载到其他内容上,这可能是问题的根源。

我不确定有一种优雅的方法来实现你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接