18

第一个问题!


环境

MVC、C#、AppHarbor。

问题

我正在调用一个 openid 提供程序,并根据域生成一个绝对回调 url。

在我的本地机器上,如果我点击,这工作正常http://localhost:12345/login

Request.Url; //gives me `http://localhost:12345/callback`

但是,在我正在部署的 AppHarbor 上,因为它们使用的是非标准端口,即使我在“ http://sub.example.com/login ”上点击它

Request.Url; //gives me http://sub.example.com:15232/callback

这搞砸了我的回调,因为端口号不在原始源 URL 中!

我试过了

  • 请求网址
  • Request.Url.OriginalString
  • Request.RawUrl

一切都给了我“ http://sub.example.com:15232/callback ”。

还要澄清这不是领域问题,我从 DotNetOpenAuth 收到的错误消息是

'http://sub.example.com:14107/accounts/openidcallback' not under realm 'http://*.example.com/'. 

我不认为我已经填满了?

现在,我要考虑一些 hacky 的东西,比如

  • 预处理器命令(#IF DEBUG THEN PUT PORT)
  • 字符串替换 (Request.URL.Contains("localhost"))

所有这些都不是 100% 的解决方案,但我厌倦了思考我可能缺少的简单属性。我也读过这个,但这似乎没有一个可以接受的答案(更多的是关于路径而不是权威)。所以我把它放在你们身上。

概括

所以如果我有http://localhost:12345/login,我需要http://localhost:12345/callback从 Request 上下文中获取。

如果我有“ http://sub.example.com/login ”,我应该得到“ http://sub.example.com/callback ”,不管它在哪个端口上。

谢谢!(睡觉时间,早上会回答任何问题)

4

6 回答 6

22

这是 AppHarbor 等负载平衡设置中的常见问题 - 我们提供了一个示例解决方法

更新:对于许多 ASP.NET 应用程序来说,一个更理想的解决方案可能是将aspnet:UseHostHeaderForRequestUrlappSetting 设置为true. 我们(AppHarbor)已经看到一些客户在使用 WCF 应用程序时遇到问题,这就是为什么我们没有默认启用它并且仍然针对这些情况推荐上述解决方案。您可以使用 AppHarbor 的“配置变量”对其进行配置,以便在部署时注入 appsettings。更多信息可以在这篇文章中找到。

于 2011-10-09T00:52:20.807 回答
1

我最近遇到了一个问题,我将 URL 与当前 URL 进行了比较,然后基于此突出显示导航。它在本地工作,但在生产中不起作用。

我有http://example.com/path/to/file.aspx我的文件,但是在查看该文件并在负载平衡的生产环境中运行Request.Url.ToString()它时。https://example.com:81/path/to/file.aspx

现在我习惯于Request.Url.AbsolutePath只给我/path/to/file.aspx,因此忽略了架构、主机名和端口号。

当我需要将它与我使用的每个导航项上的 URL 进行比较时: New Uri(theLink.Href).AbsolutePath

于 2013-05-23T14:34:21.357 回答
0

我最初的想法是获取引用变量并检查它是否包含端口,如果是,则使用它,否则不要。

如果这不是一个选项,因为代理可能会删除引荐来源标头变量,那么您可能需要使用一些客户端脚本来获取位置并将其传递回服务器。

我猜 AppHarbor 使用端口转发到 IIS 服务器,因此即使该站点公开位于端口 80 上,IIS 也将它托管在另一个端口上,因此它无法知道客户端连接的端口。

于 2011-10-06T13:38:50.953 回答
0

就像是

String port = Request.ServerVariables["SERVER_PORT"] == "80" ? "" : ":" + Request.ServerVariables["SERVER_PORT"];
String virtualRoot = Url.Content("~/");
destinationUrl = String.Format("http://{0}{1}{2}", Request.ServerVariables["SERVER_NAME"], port + virtualRoot, "/callback");
于 2011-10-06T13:52:00.887 回答
0

如果您在框架中使用 UrlBuilder 类,您可以轻松解决这个问题。在构建器类上,如果您将端口设置为 -1,则端口号将被删除:

new UriBuilder("http://sub.example.com:15232/callback"){ Port = -1}

返回:http ://sub.example.com/callback

要将端口号保留在本地计算机上,只需检查 Request.IsLocal 并且不要将 -1 应用于端口。

我会将其包装到扩展方法中以保持清洁。

于 2014-03-11T18:13:45.083 回答
0

我看到这是一个旧线程。我在 IIS 7.5 上运行 MVC5 时遇到了这个问题,前面有一个 Apache 代理。在服务器之外,我会得到“空响应”,因为 asp.net 应用程序使用自定义端口从 apache 获取 Url。

为了让应用程序重定向到不包含“自定义”端口的子路径,请忘记 Response/Request 对象,并使用 Transfer 方法。例如,如果我希望用户在尚未登录的情况下自动重定向到登录页面:

if (!User.Identity.IsAuthenticated)   
    Server.TransferRequest("Account/Login");
于 2015-09-18T14:08:25.397 回答