ASP.NET MVC站点在AWS ELB之后无法正常工作

ASP.NET MVC站点在AWS ELB之后无法正常工作,asp.net,asp.net-mvc,amazon-web-services,amazon-elb,Asp.net,Asp.net Mvc,Amazon Web Services,Amazon Elb,我正在尝试将一个使用单个用户帐户的ASP.NET MVC web应用程序部署到使用弹性负载平衡器(ELB)的AWS服务器上。我已将该站点部署到AWS应用服务器上的IIS,并将其连接到我的AWS SQL server,它在服务器上的工作与预期的一样(事实上,当我在Visual Studio中运行它或部署到内部服务器时) 当远程访问它时,问题就来了,当然是通过ELB 如果我尝试访问它不起作用-它会将我重定向到,挂起,然后我得到一个408错误 如果我尝试访问,比如说,它不起作用-它会将我重定向到哪只

我正在尝试将一个使用单个用户帐户的ASP.NET MVC web应用程序部署到使用弹性负载平衡器(ELB)的AWS服务器上。我已将该站点部署到AWS应用服务器上的IIS,并将其连接到我的AWS SQL server,它在服务器上的工作与预期的一样(事实上,当我在Visual Studio中运行它或部署到内部服务器时)

当远程访问它时,问题就来了,当然是通过ELB

  • 如果我尝试访问它不起作用-它会将我重定向到,挂起,然后我得到一个408错误
  • 如果我尝试访问,比如说,它不起作用-它会将我重定向到哪只手,然后我会得到一个408错误
  • 如果我尝试直接访问,它工作得很好。然后我可以登录,我的网站中的所有页面都可以正常工作。如果我退出,我会被重定向到,然后我会得到一个408错误
所以基本上,如果我登录了,就可以了。如果我没有登录,登录页面就可以了,但没有其他功能。我的想法是,当我被重定向到登录页面时,这是一个HTTP请求,而不是HTTPS,这是问题的原因,但无论我做了什么尝试,我都无法用HTTPS重定向。我试过:

  • 在我的web.config文件中添加规则来获取转发的请求并将它们重定向到HTTPS——这似乎并没有带来任何明显的区别
  • 我的FilterConfig或登录操作中添加了各种不同的属性
  • 使用URL重写直接在IIS中添加规则
显然,我的解决方法是让每个人都转到登录页面并从那里开始,而不仅仅是根URL,但我真的希望对其进行排序,就好像重定向在这里不起作用一样,我可以看到它在其他地方不起作用,并可能导致问题


按要求更新:我实际上无法控制我的ELB,因为这是由另一个团队完成的,但我从与团队交谈中了解到,它接受HTTPS流量,然后将其作为HTTP传递给服务器

MVC应用程序被配置为在用户需要登录时重定向到绝对http URL而不是相对URL

对于基于Owin中间件的新MVC应用程序,这是在
App\u Start/Startup.Auth.cs
中配置的

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});
然后,在类的后面,添加以下函数:

private static void ApplyRedirect(CookieApplyRedirectContext context)
{
    Uri absoluteUri;
    if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
    {
        context.Response.Redirect(absoluteUri.PathAndQuery);
        return;
    }

    context.Response.Redirect(context.RedirectUri);
}

基本上,这是将绝对URL转换为相对URL。然后将相对URL传递回浏览器。由于重定向是相对的,它应该维护https URL。

请更新您的问题,以包括ELB侦听器的配置。听起来您的ELB被配置为接受HTTPS(负载平衡器端口),并将流量作为HTTP(实例端口)传递到服务器,但希望进行验证。您可以从AWS Web控制台的EC2>负载平衡>负载平衡器下查看此内容。如果不以HTTPS的形式发出请求确实是个问题,那么您也可以在这里解决它。@AnthonyNeace更新-我很确定您是正确的,这就是在
web.config
文件中设置它的方式,
forms
元素中的
loginUrl
值是多少?@MattHouser我的
web.config
中没有
forms
元素-我有
,我相信它来自原始的ASP.NET MVC模板。那么,您的MVC应用程序中有什么强制执行登录重定向?您的MVC应用程序中存在以下问题:(a)需要
DashboardController
才能获得授权,以及(b)重定向到哪个页面才能让用户登录。我已根据MVC Owin应用程序更新了我的答案,该应用程序返回一个绝对
位置:
重定向。这个答案提供了一种将其转换为相对的方法。这是有意义的-它目前对我的预生产服务器没有任何影响,但我现在根本没有在那里重定向,只是一个500错误,所以我怀疑我在这一过程中破坏了其他东西。一旦我在这个环境中对所有内容进行了排序,我将进行适当的尝试。似乎我实际上没有收到500个错误,一定是缓存有问题,因为当我在另一台计算机上尝试时,它工作正常,然后当我清除cookies等时,它工作正常。但这已经解决了这个问题-非常感谢!
private static void ApplyRedirect(CookieApplyRedirectContext context)
{
    Uri absoluteUri;
    if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
    {
        context.Response.Redirect(absoluteUri.PathAndQuery);
        return;
    }

    context.Response.Redirect(context.RedirectUri);
}