2016-10-28 73 views
2

我正在嘗試將使用單個用戶帳戶的ASP.NET MVC Web應用程序部署到使用彈性負載平衡器(ELB)的AWS服務器。我已將該站點部署到AWS應用服務器上的IIS,將其連接到我的AWS SQL服務器,並且它在服務器上按預期工作(事實上,當我在Visual Studio中運行它或部署到內部服務器時)。ASP.NET MVC網站在AWS後面無法正常工作ELB

遠程訪問時出現問題,當然這是通過ELB進行的。

所以基本上,如果我登錄了,沒關係。如果我沒有登錄,登錄頁面沒問題,但沒有別的。我的想法以及我們內部團隊的一位與AWS合作的同事(他不能幫助我順便說一句,我問過!)是,當我重定向到登錄頁面時,它是一個HTTP請求,而不是HTTPS ,這就是問題的原因,但不管我嘗試過什麼,我都無法使用HTTPS重定向。我已經試過:

  • 添加規則在我的web.config文件拿起轉發的請求,並將其重定向到HTTPS - 這似乎並沒有取得任何顯着的區別
  • 各種不同的屬性添加到任我的一個FilterConfig或登錄動作
  • 使用URL在IIS中直接添加規則重寫

顯然,我的解決方法是讓每個人都去到登錄頁面,並從那裏開始,而不是僅僅根URL,但我真的很想像這樣排序,就好像重定向沒有在這裏工作,我可以看到它不在其他地方工作,並可能導致問題。

根據請求更新:我實際上並沒有任何對我的ELB的控制權,因爲這是由不同的團隊完成的,但是我從團隊的角度來理解,它將流量接受爲HTTPS,然後將其傳遞給服務器作爲HTTP。

+0

請更新您的問題以包含您的ELB監聽器的配置。聽起來您的ELB配置爲接受HTTPS(負載平衡器端口),並將流量作爲HTTP(實例端口)傳遞到您的服務器,但希望驗證。您可以從AWS Web Console在EC2>負載平衡>負載平衡器下查看此信息。如果沒有將請求作爲HTTPS確實是問題,那麼這也是您可以修復它的地方。 –

+0

@AnthonyNeace更新 - 我敢肯定你是正確的,這就是它的設置 – alfredbulbasaur

+0

在你的'web.config'文件中,'forms'元素中的'loginUrl'值是什麼? –

回答

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。

+0

我已經根據MVC Owin應用程序更新了我的答案,該應用程序返回絕對'Location:'重定向。這個答案提供了一種將它轉換爲相對的方法。 –

+0

這很有道理 - 目前它對我的預製服務器沒有任何影響,但是目前我沒有在那裏重定向,只有500錯誤,所以我懷疑我已經打破了其他方法。一旦我用這種環境對所有東西進行排序,會給它一個適當的嘗試。 – alfredbulbasaur

+0

看來,我實際上並沒有得到500錯誤,肯定是我的緩存中的東西,因爲當我在另一臺電腦上試用它時,它工作正常,然後當我清除cookie等工作正常。但是這已經解決了這個問題 - 非常感謝! – alfredbulbasaur

相關問題