首页 > 解决方案 > ASP.NET web.config 授权 403 错误

问题描述

管理员到新的 ASP.NET Web 解决方案。

这个web.config文件让我很困惑,我在网上找不到这样的东西。2个问题:

这看起来对吗?

<authentication mode="Forms">
        <forms loginUrl="Authentication/SignIn.aspx" timeout="121" slidingExpiration="true" cookieless="UseCookies" />
        </authentication>
        <authorization>
            <deny users="?" />
            <allow users="*" />
        </authorization>

具体来说,允许后面的拒绝是否有意义?为什么你会有一个拒绝然后允许所有人?

第二个问题:在 web.config 的更下方,我们允许未经身份验证的用户访问以下页面。

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

我需要允许访问特定的查询参数,以防止未经身份验证的用户出现 403 错误。

示例:www.abc.com/?value=Test

<location path="?value=Test">
    <system.web>
        <authorization>
            <allow users="?" />
        </authorization>
    </system.web>
</location>

这行不通,这是我没想到的。问题是我有正常的客户,他们 www.abc.com 重定向到登录页面并且运行良好且正常工作。但是我有使用查询参数将它们路由到特定登录页面的 SSO 客户端。

标签: asp.netwebforms

解决方案


具体来说,允许后面的拒绝是否有意义?为什么你会有一个拒绝然后允许所有人?

是的,这很有意义。请注意,此处使用了两个不同的通配符。

?表示匿名的、尚未经过身份验证的请求

*意味着任何请求,无论是否经过身份验证

规则按顺序检查。

这两个,按照这个特定的顺序,使引擎只重定向不经过身份验证的请求,而是传递任何其他(= 这里:经过身份验证的)请求。

我需要允许访问特定的查询参数,以防止未经身份验证的用户出现 403 错误。

如果您在任何请求 uri上都需要此查询参数,那么您就不走运了。这在这里并不容易,因为您已经有了上面定义的两个规则。这两个将始终有效,并且没有简单的(声明性)方法可以解决这个问题

<deny users="?" />

有条件地,基于查询字符串参数。

但是我有使用查询参数将它们路由到特定登录页面的 SSO 客户端。

有道理,但是您可能必须重新设计您的方法。

如果我理解正确,您希望这两个规则始终有效,但如果将特定查询字符串参数放在 uri 上,您希望关闭这两个规则。

我在这里要做的是我将拥有我的自定义授权模块,该模块将替换authorization放入的规则web.config

对于发送到登录页面和错误页面以外的任何未经身份验证的请求,此授权模块将从管道中的授权请求事件中引发 401 状态代码。这两个例外(登录和错误)与您对授权如何工作的定义一致。但是如果找到查询字符串参数 - 你跳过这个。

因为在执行处理程序之前在管道中引发了 401,所以 ASP.NET 运行时不会呈现任何页面,而是会继续处理管道,直到它到达结束请求事件。这是您检查 401 是否引发的地方,如果是,则将 401 替换为 200 并重定向到登录页面。

取决于上面这听起来是否困难,您可以让它快速工作,或者您需要一些时间来编写这样的授权模块。如果您需要进一步的建议,请留言。


推荐阅读