ASP.NET web.config授权403错误
ASP.NET web.config authorization 403 errors
新 ASP.NET 网络解决方案的管理员。
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=测试
<location path="?value=Test">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
这行不通,我没想到会这样。
问题是我有普通客户端 www.abc.com 重定向到登录页面并且正常运行。
但是我有使用查询参数将它们路由到特定登录页面的 SSO 客户端。
Specifically, does the deny followed by the allow make any sense? Why would you have a deny followed by allow everyone?
是的,这很有意义。请注意,这里使用了两个不同的通配符。
?
表示匿名的、尚未验证的请求。
*
表示任何请求,无论是否经过身份验证。
按顺序检查规则。
两者按照这个特定的顺序,使引擎仅重定向未经过身份验证的请求,但传递任何其他(= 此处:经过身份验证的)请求。
I need to allow access to a particular query parameter, to prevent 403 errors for unauthenticated users.
如果您在 任何请求 uri 上需要此查询参数,那么您就不走运了。这在这里并不容易,因为您已经定义了上面的两个规则。这两个将始终有效,并且没有简单的(声明性的)方法来证明这一点
<deny users="?" />
有条件地,基于查询字符串参数。
But I have SSO clients that use a query parameter to route them to their specific login page.
有道理,但是您可能不得不重新设计您的方法。
如果我理解正确,您希望这两个规则始终有效,但如果将特定查询字符串参数放在 uri 上,您希望关闭这两个规则。
我在这里要做的是让我的自定义授权模块替换 web.config
中的 authorization
规则。
此授权模块将从管道中的 授权请求 事件引发 401 状态代码,用于发送到登录页面和错误页面以外的任何未经身份验证的请求。这两个异常(登录和错误)与您对授权工作方式的定义一致。但是如果找到查询字符串参数 - 你跳过这个。
因为在执行处理程序之前在管道中引发了 401,所以 ASP.NET 运行时不会呈现任何页面,但会继续管道直到它到达 结束请求 事件。这是您检查是否出现 401 的地方,如果是,您将 401 替换为 200 并重定向到登录页面。
根据以上听起来是否困难,您可以快速完成此操作,或者需要一些时间来编写此类授权模块。如果您需要进一步的建议,请留言。
新 ASP.NET 网络解决方案的管理员。
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=测试
<location path="?value=Test">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
这行不通,我没想到会这样。 问题是我有普通客户端 www.abc.com 重定向到登录页面并且正常运行。 但是我有使用查询参数将它们路由到特定登录页面的 SSO 客户端。
Specifically, does the deny followed by the allow make any sense? Why would you have a deny followed by allow everyone?
是的,这很有意义。请注意,这里使用了两个不同的通配符。
?
表示匿名的、尚未验证的请求。
*
表示任何请求,无论是否经过身份验证。
按顺序检查规则。
两者按照这个特定的顺序,使引擎仅重定向未经过身份验证的请求,但传递任何其他(= 此处:经过身份验证的)请求。
I need to allow access to a particular query parameter, to prevent 403 errors for unauthenticated users.
如果您在 任何请求 uri 上需要此查询参数,那么您就不走运了。这在这里并不容易,因为您已经定义了上面的两个规则。这两个将始终有效,并且没有简单的(声明性的)方法来证明这一点
<deny users="?" />
有条件地,基于查询字符串参数。
But I have SSO clients that use a query parameter to route them to their specific login page.
有道理,但是您可能不得不重新设计您的方法。
如果我理解正确,您希望这两个规则始终有效,但如果将特定查询字符串参数放在 uri 上,您希望关闭这两个规则。
我在这里要做的是让我的自定义授权模块替换 web.config
中的 authorization
规则。
此授权模块将从管道中的 授权请求 事件引发 401 状态代码,用于发送到登录页面和错误页面以外的任何未经身份验证的请求。这两个异常(登录和错误)与您对授权工作方式的定义一致。但是如果找到查询字符串参数 - 你跳过这个。
因为在执行处理程序之前在管道中引发了 401,所以 ASP.NET 运行时不会呈现任何页面,但会继续管道直到它到达 结束请求 事件。这是您检查是否出现 401 的地方,如果是,您将 401 替换为 200 并重定向到登录页面。
根据以上听起来是否困难,您可以快速完成此操作,或者需要一些时间来编写此类授权模块。如果您需要进一步的建议,请留言。