ASP.NET MVC网站在AWS ELB后面无法正常工作

5
我正在尝试将使用单个用户帐户的ASP.NET MVC Web应用程序部署到使用弹性负载平衡器(ELB)的AWS服务器上。我已将站点部署到AWS应用程序服务器上的IIS,并将其连接到我的AWS SQL服务器,在服务器上按预期工作(当我在Visual Studio中运行它或部署到内部服务器时也是如此)。问题出现在远程访问时,当然会经过ELB。 所以基本上,如果我已登录,一切正常。 如果我没有登录,则登录页面很好,但其他任何页面都不行。 我的想法是,当我被重定向到登录页面时,它是一个HTTP请求而不是HTTPS,这就是问题的原因,但无论我尝试什么,都无法使用HTTPS重定向。 我已经尝试过:
- 在我的web.config文件中添加规则来获取转发请求并将其重定向到HTTPS-似乎没有产生任何明显的区别 - 添加到我的FilterConfig或Login操作的各种属性 - 直接在IIS中使用URL Rewrite添加规则
显然,我的解决方法是让每个人都去登录页面并从那里开始,而不仅仅是根URL,但我真的希望解决这个问题,因为如果在这里重定向不起作用,我可以看到它在其他地方也不起作用,并潜在地引起问题。
更新要求:实际上,我对ELB没有任何控制权,因为那是由另一个团队完成的,但是我与该团队交谈后了解到,它接受HTTPS流量,然后将其作为HTTP传递给服务器。

请更新您的问题,以包括ELB监听器的配置。听起来您的ELB已配置为接受HTTPS(负载均衡器端口)并将流量传递到服务器作为HTTP(实例端口),但希望进行验证。您可以在AWS Web控制台下的EC2 > Load Balancing > Load Balancers中查看此内容。如果没有作为HTTPS发出请求确实是问题所在,那么这也是您能够修复它的地方。 - Anthony Neace
@AnthonyNeace 更新 - 我非常确定你是正确的,那就是它的设置方式。 - alfredbulbasaur
您的 web.config 文件中,在 forms 元素中,loginUrl 的值是什么? - Matt Houser
@MattHouser 我的 web.config 中没有 forms 元素 - 我有 <authentication mode="None" />,我相信这是来自原始的 ASP.NET MVC 模板。 - alfredbulbasaur
1
那么在你的MVC应用程序中是什么在强制进行登录重定向?你的MVC应用程序中有一些内容(a)要求DashboardController要求授权,并且(b)需要重定向到哪个页面以使用户登录。 - Matt Houser
在我的每个控制器上,我都有一个名为ExpiredPasswordAttribute的属性,它扩展了AuthorizeAttribute。基本上,它会检查用户是否已登录,如果是,则检查他们上次设置密码的时间,如果超过了设定的限制,则重定向到Manage/ChangePassword页面进行更改。我不知道在我的应用程序中明确说明未登录时重定向到Account/Login;我假设这是ASP.NET MVC内部的惯例。 - alfredbulbasaur
1个回答

3

如果用户需要登录,您的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应用程序更新了我的答案。这个答案提供了一种将其转换为相对路径的方法。 - Matt Houser
这很有道理 - 目前在我的预生产服务器上没有任何区别,但是我目前根本没有被重定向,只有一个500错误,所以我怀疑我在途中破坏了其他东西。一旦我解决了这个环境的所有问题,我会认真尝试它。 - alfredbulbasaur
好像我实际上并没有收到500错误,可能是我的缓存有问题,因为当我在另一台电脑上尝试时它正常工作了,然后当我清除了Cookie等内容后它也正常工作了。但这解决了问题 - 非常感谢! - alfredbulbasaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接