1

有净配置:

客户端 - 固件 - IIS

IIS 正在监听 8080 端口,IIS 上有一个 Web 应用程序,例如 MyApp。FW 实现了简单的端口转发(它将端口 80 替换为端口 8080)。假设以下情况:

客户要求http://MyWebSite/MyApp/Index.aspx,FW 将标准端口 80 更改为 8080,请求是 http://MyWebSite:8080/MyApp/Index.aspx。IIS 返回到客户端请求的页面 Index.aspx 一件重要的事情:如果用户在浏览器中键入http://MyWebSite/myapp/index.aspxIIS 返回http://MyWebSite/MyApp/Index.aspx(因此它会根据真实的应用程序名称更改 url 地址)。一切正常。

但是如果我插入标准管道 WIF,就会出现问题。例如,我希望 MyApp 只接受经过身份验证的用户。我想将用户重定向到某个身份提供者。如果用户试图获取页面http://MyWebSite/MyApp/Index.aspx,一切正常,用户被重定向到 IP。但是如果用户试图获取http://MyWevSite/myapp/index.aspx(小写的应用程序名称),IIS 会返回客户端重定向到http://MyWebSite:8080/MyApp/Index.aspx. 因为端口 8080 在 FW 上关闭,所以用户收到错误。如果我从我的应用程序中删除 WIF,一切都会再次正常运行。

有人遇到过问题吗?

4

1 回答 1

1

问题是 Reflector 发现的,在 WIF 的 CookieHandler 中。

浏览器仅在请求的路径与 CookieHandler 设置的路径匹配(区分大小写)时才发送 cookie(默认情况下,应用程序在 IIS 上的虚拟目录)。当 WIF 处理请求时,它会将请求的路径与 CokkieHandler 的路径进行比较。如果它们不匹配(区分大小写)WIF 认为用户只是输入了错误的大小写 URL,但他或她仍想访问应用程序,但用户的浏览器不会发送会话 cookie,因为大小写不匹配,所以 WIF 的 CookieHandler重定向到正确的 URL,但它对真实端口号一无所知,所以它只是添加了请求的端口号来重定向答案。浏览器尝试进行重定向,请求的端口在 FW 上关闭,我们收到错误。

在 .NET FW 4.5 中,您可以使用自己的自定义 CookieHandler 并实现其 MatchCookiePath 方法来覆盖 CookieHandler 的默认行为(例如,您可以从应用程序配置文件中添加特殊端口号)。

您也可以只使用小写的 url 和应用程序名称,并在 WIF 开始处理之前对每个请求进行小写,这样就不会有重定向。

于 2013-02-27T04:34:23.277 回答