5

AppHarbor のアプリケーションは、NGINX ロード バランサーの背後にあります。このため、SSL はこのフロント エンドによって処理されるため、クライアント アプリにヒットするすべての要求は HTTP 経由で送信されます。

ASP.NET MVC の OAuth 2 OAuthAuthorizationServerOptions には、トークン要求へのアクセスを HTTPS のみを使用するように制限するオプションがあります。問題は、Controller や ApiController とは異なり、AllowInsecureHttp = false を指定したときにこれらの転送されたリクエストを許可する方法がわからないことです。

具体的には、アプリの起動/構成で:

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

どうにかしてこのチェックを内部で行う必要があり、それが true の場合は SSL として扱います。

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

カスタムフィルター属性を適用してMVCコントローラーを使用する方法は次のとおりです: https://gist.github.com/runesoerensen/915869

4

1 に答える 1

8

nginx によって転送されたヘッダーに基づいてリクエストを変更できるミドルウェアを試して登録することができます。X-Forwarded-Forおそらく、リモート IP アドレスをヘッダーの値に設定することもできます。

このようなものは動作するはずです(テストされていません):

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,
});
于 2014-06-14T01:26:35.137 に答える