为什么在我的网站上进行重定向会将我带到azure.websites.net而不是我的域?

时间:2018-10-01 14:08:44

标签: c# asp.net-mvc azure asp.net-mvc-5 azure-web-sites

通过在Startup.auth.cs文件中设置以下内容,我已将Web应用配置为在空闲时超时:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
     ExpireTimeSpan = TimeSpan.FromHours(1),
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
     LoginPath = new PathString("/Account/Login"),
     SlidingExpiration = true,
     ....
}

我的Web应用程序位于虚拟网络->应用程序网关的后面。 AG将请求转发到Web应用程序。我也有一些规则,可以防止直接访问Web应用程序(即myapp.azurewebsites.com)。

现在,会话超时时,我将重定向到:

https://myapp.azurewebsites.net/Account/Login?ReturnUrl=%2Fcustomerarea

这是一个蓝屏,显示错误403(正确错误),而不是我自己的域,例如:

https://example.com/Account/Login?ReturnUrl=%2Fcustomerarea

谁知道我为什么会出现这种情况?谢谢。

编辑:更多信息...似乎任何重定向都会导致上述问题。因此,如果我输入要求用户登录的URL https://example.com/customerarea,则重定向到登录页面的URL的地址中将包含azurewebsites.net。

2 个答案:

答案 0 :(得分:1)

ASP.NET生态系统中任何没有显式主机部分的重定向都将转到当前HttpContext.Request提供的主机部分。

您的应用程序网关将向您的应用程序(如代理服务器)发出最终请求,并将其作为您的.azurewebsites.net域寻址→这意味着您的ASP.NET应用程序不知道对网关的原始请求。

您需要做的是将传入的请求主机名设置为发送到应用程序网关的请求中的原始主机名。

This documentation page(它是ASP.NET Core,但是对于asp.net-mvc-5来说,这是相同的原理),应该使您了解如何将传入的HttpContext.Request主机名覆盖为原始主机名。 。当然有多种方法。

  1. 转发标头(然后需要由您的应用程序网关设置)
  2. 配置项(具有一个带有“硬编码”主机名的配置项)

这两种方法都只需要额外的中间件即可根据这两种方法收集的信息覆盖当前请求。

答案 1 :(得分:1)

因此上述答案是正确的。我将添加有关如何解决MVC 5 Web应用程序中问题的更多信息。根据{{​​3}}:

应用程序网关还插入X-Original-Host标头,该标头包含请求到达的原始Host标头。此标头在Azure网站集成等方案中很有用,在该方案中,在将流量路由到后端之前修改传入的主机标头。

为解决此问题,我在start.cs文件的Configuration (IAppBuilder app)方法顶部添加了以下代码:

app.Use(async (context, next) =>
{
  if (context.Request.Headers.GetValues("X-Original-Host") != null)
  {
    var originalHost = context.Request.Headers.GetValues("X-Original-Host").FirstOrDefault();
    context.Request.Headers.Set("Host", originalHost);
  }
  await next.Invoke();
});