【问题标题】:ASP.NET MVC site not working correctly behind AWS ELBASP.NET MVC 站点在 AWS ELB 后面无法正常工作
【发布时间】:2017-03-11 11:13:11
【问题描述】:

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

远程访问它时会出现问题,这当然是通过 ELB 进行的。

所以基本上,如果我登录了,那就没问题了。如果我没有登录,登录页面很好,但没有别的。我的想法以及我们内部团队的一位与 AWS 合作的同事(顺便说一句,他无法帮助我,我问过!)是,当我被重定向到登录页面时,这是一个 HTTP 请求,而不是 HTTPS ,这就是问题的原因,但无论我尝试了什么,我都无法使用 HTTPS 重定向它。我试过了:

  • 在我的 web.config 文件中添加规则以获取转发的请求并将它们重定向到 HTTPS - 这似乎没有任何明显的区别
  • 向我的 FilterConfig 或登录操作添加了各种不同的属性
  • 使用 URL 重写直接在 IIS 中添加规则

显然,我的解决方法是让每个人都去登录页面并从那里开始,而不仅仅是根 URL,但我真的很想把这个排序,好像重定向在这里不起作用,我可以看到它不是在其他地方工作并可能导致问题。

按要求更新:我实际上对我的 ELB 没有任何控制权,因为这是由另一个团队完成的,但我与团队交谈的理解是,它以 HTTPS 的形式接受流量,然后将其传递给服务器HTTP。

【问题讨论】:

  • 请更新您的问题以包括您的 ELB 侦听器的配置。听起来您的 ELB 配置为接受 HTTPS(负载平衡器端口),并将流量作为 HTTP(实例端口)传递到您的服务器,但想验证。您可以从 AWS Web 控制台的 EC2 > 负载平衡 > 负载平衡器下查看此内容。如果不是以 HTTPS 方式发出请求确实是问题所在,这也是您可以修复它的地方。
  • @AnthonyNeace 已更新 - 我很确定你是正确的,这就是它的设置方式
  • 在您的web.config 文件中,forms 元素中的loginUrl 值是什么?
  • @MattHouser 我的web.config 中没有forms 元素-我有<authentication mode="None" />,我相信它来自原始的ASP.NET MVC 模板
  • 那么在您的 MVC 应用程序中执行登录重定向的内容是什么?您的 MVC 应用程序中有一些东西 (a) 要求 DashboardController 要求授权,以及 (b) 重定向到哪个页面以让用户登录。

标签: asp.net asp.net-mvc amazon-web-services amazon-elb


【解决方案1】:

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

对于基于 Owin 中间件的新 MVC 应用程序,这是在 App_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))
    }
});

并在OnValidateIdentity 属性后添加以下内容:

OnApplyRedirect = ApplyRedirect  

然后,稍后在类中,添加以下函数:

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。

【讨论】:

  • 我已经根据返回绝对 Location: 重定向的 MVC Owin 应用程序更新了我的答案。这个答案提供了一种将其转换为相对的方法。
  • 这是有道理的——它目前对我的预生产服务器没有任何影响,但我目前根本没有被重定向,只是一个 500 错误,所以我怀疑我已经一路上打破了其他东西。一旦我用这个环境对所有东西进行了排序,就会给它一个适当的尝试。
  • 看来我实际上并没有收到 500 错误,一定是我的缓存有问题,因为当我在另一台计算机上尝试它时它运行良好,然后当我清除 cookie 等时它运行良好.但这已经解决了这个问题 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多