2014-06-13 53 views
4

AppHarbor的應用程序位於NGINX負載均衡器的後面。因此,所有打到客戶端應用程序的請求都將通過HTTP進行處理,因爲SSL將由此前端處理。AppHarbor的反向代理導致SSL和app.UseOAuthBearerTokens問題ASP.NET MVC 5

ASP.NET MVC的OAuth 2 OAuthAuthorizationServerOptions有選項來限制對令牌請求的訪問,以僅使用HTTPS。問題是,與Controller或ApiController不同,當我指定AllowInsecureHttp = false時,我不知道如何允許這些轉發的請求通過。

具體而言,在應用程序啓動/配置:

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions { 
      AllowInsecureHttp = true, 
    }); 

需要以某種方式做這種檢查在內部,如果這是真的,把它作爲SSL:

HttpContext.Request.Headers["X-Forwarded-Proto"] == "https" 

下面是我如何做到這一點使用MVC控制器的應用自定義過濾器屬性: https://gist.github.com/runesoerensen/915869

回答

6

您合作你可以嘗試並註冊一些中間件,這些中間件可以根據nginx轉發的頭文件修改請求。您可能還希望將遠程IP地址設置爲X-Forwarded-For標題的值。

像這樣的東西應該工作(未經測試):

public class AppHarborMiddleware : OwinMiddleware 
{ 
    public AppHarborMiddleware(OwinMiddleware next) 
     : base(next) 
    { 
    } 

    public override Task Invoke(IOwinContext context) 
    { 
     if (string.Equals(context.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      context.Request.Scheme = "https"; 
     } 

     var forwardedForHeader = context.Request.Headers["X-Forwarded-For"]; 
     if (!string.IsNullOrEmpty(forwardedForHeader)) 
     { 
      context.Request.RemoteIpAddress = forwardedForHeader; 
     } 
     return Next.Invoke(context); 
    } 
} 

確保您配置驗證的中間件之前添加:

app.Use<AppHarborMiddleware>(); 
app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
{ 
    AllowInsecureHttp = false, 
}); 
+0

地獄是的!這正是我正在尋找的。我沒有意識到這個請求是一個可變的東西。這感覺更多NodeJSy。奧利快樂。 –

+0

謝謝appharbor。你們好棒。 –

+1

真棒,很高興幫助! :-) – runesoerensen