2

AppHarborでホストされている asp.net 3.5 でアプリケーションを構築しました。問題は、HTTPS で URL 書き換えが機能しないことです。以下は、SSL で一部のページを実行するためのコードです。

string CurrentUrl = Request.Url.ToString();
string sPath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;      
System.IO.FileInfo oInfo = new System.IO.FileInfo(sPath);
string sRet = oInfo.Name;       
string sDir = oInfo.Directory.Name;     
pageName = sRet;
if (sRet == "Register.aspx" || sRet == "Login.aspx" || sRet == "Post.aspx" || sRet == "ChangePassword.aspx" || sRet == "ChangeUserStatus.aspx" || sRet == "Verification.aspx" || sRet == "ContactInfo.aspx" || sRet == "Find.aspx" || sRet == "MyAccount.aspx" || sRet == "MyEmailAddresses.aspx" || sRet == "Load.aspx" || sRet == "MyPostedLoads.aspx" || sRet == "MySubmittedBids.aspx" || sRet == "MySavedAddresses.aspx" || sRet == "MyCarriers.aspx" || sRet == "MyPotentialLoads.aspx" || sRet == "MyFreightAlarms.aspx" || sRet == "MyFreightAlarmsPreferences.aspx" || sRet == "MyAddress.aspx" || sRet == "GetUserComments.aspx" || sRet == "MyCreditCard.aspx" || sRet == "MyWallet.aspx" || sRet == "InvoiceMe.aspx" || sRet == "MyShippers.aspx" || sRet == "MyCoWorkers.aspx" || sRet == "MyACH.aspx" || sRet == "RouteMap.aspx" || sRet == "Pricing.aspx" || sRet == "PricingPayment.aspx" || sRet == "PaymentProcessed.aspx")
{
    string NewUrl = "";

    if (!Request.IsSecureConnection && !string.Equals(HttpContext.Current.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.OrdinalIgnoreCase))
    {
        NewUrl = Regex.Replace(CurrentUrl,
                               @"^https?(://[^/:]*)(:\d*)?", 
                               "https$1", 
                               RegexOptions.IgnoreCase);

        Response.Redirect(NewUrl);
    }
}

また、web.config での URL 書き換えのルールは次のとおりです。

<rewrite>
  <rules>
    <rule name="Rewrite with .aspx" stopProcessing="true">
      <match url="^([^\.]+)$" />
      <action type="Rewrite" url="{R:1}.aspx" />
    </rule>
    <rule name="Redirect .aspx page requests" stopProcessing="true">
      <match url="(.+)\.aspx" />
      <action type="Redirect" url="{R:1}" />
    </rule>
  </rules>
</rewrite>

問題は、そのページが無限ループに残り、適切にリダイレクトできないことです。

4

2 に答える 2

0

RequireHttpsAttribute:組み込みのRequireHttpsAttributeを使用して、コントローラーアクションが常にHTTPSを使用するようにする場合、リダイレクトループが発生します。その理由は、SSLがロードバランサーレベルで終了し、 RequireHttpsがHTTPSを使用してリクエストが行われたことを示すために使用するX-Forwarded-Protoヘッダーを認識しないためです。

「肉」は太字で示しています。

AppHarborSSLFAQ-特にトラブルシューティングのセクションを参照してください。

Webサーバーの前にSSLコンセントレーターまたは同様のデバイスがある場合も同じ問題です。これは「クラウドホスティング」環境では非常に一般的です。

Hth...。

于 2012-07-16T22:28:09.420 に答える
0

EdSF が述べたように、発生している問題は、SSL (HTTPs) がロード バランサー レベルにあるためです。つまり、ASP.NET アプリケーションに入るすべての要求は HTTP になります。

したがって、AppHarbor で実行されているアプリケーションでは、次のことが常に当てはまります。

Request : https://mysite.com/about
---------------------------------------------------------------------------------
-> Request.Url.Scheme // http
-> Request.Url.AbsoluteUri // http://mysite.com:port/about
-> Request.issecure // false

ルールを書き直すと、protocal/scheme に依存しておりhttps、決してそうなることはなく、無限ループが発生します。

AppHarbor で実行されている ASP.NET アプリケーションで HTTPS を確認する方法は次のとおりです。

string.Equals(Request.Headers["X-Forwarded-Proto"], 
              "https", 
              StringComparison.InvariantCultureIgnoreCase);

また、Web アプリケーションを AppHarbor でホストしており、より優れたソリューションが必要だったため、SecurePagesプロジェクト ( NuGet - GitHub ) を作成しました。このプロジェクトでは、文字列リテラルと正規表現を使用してセキュア/https URL を構成できます。また、他のすべての URL で HTTP を使用するように強制します。また、HTTPs 要求一致ルールとして機能するカスタム述語デリゲートを登録することもできます。したがって、ヘッダーをチェックするために AppHarbor 用に 1 つ登録できます。

//Secure a page    
secureUrls.AddUrl("/Register.aspx");

//Secure any page under /cart/*
secureUrls.AddRegex(@"(.*)cart", RegexOptions.IgnoreCase);

//Register a custom HTTPs match rule for AppHarbor
SecurePagesConfiguration.RegisterCustomMatchRule(
                c => string.Equals(c.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.InvariantCultureIgnoreCase));

セキュリティで保護されたページは、IIS Express を使用した単体テストとローカル ブラウザー テストもサポートしています。

于 2013-09-20T17:44:49.753 に答える