2

SSL接続を使用するWebアプリケーションを構築しようとしています。そこで、調査を行ったところ、RequireHttpsAttributeクラスを使用して必要なものを実現できることがわかりました。私がそれを使用するとき、アプリケーションの実行は310エラー(リダイレクトが多すぎる)をもたらすということです。httpからhttpsへの切り替えを処理するカスタムクラスも作成しました。しかし、それもエラーになります。

プロトコルスイッチを処理する私のクラス:

Public Class RequireSSLAttribute
    Inherits ActionFilterAttribute

    Public Property IsRequired() As Boolean

    Public Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext)
        If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then
            filterContext.HttpContext.Response.Redirect(filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1), True)
            filterContext.Result = New HttpUnauthorizedResult
        End If
    End Sub

    Public Sub New()
        IsRequired = True
    End Sub
End Class
4

2 に答える 2

12

あなたのホストが誰であるかはわかりませんが、AppHarborで同様の問題が発生し、ナレッジベースでこれを発見しました。

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

また、Githubでソリューションの例をここに提供しています。これは、便宜上、以下にコピーします。

using System;
using System.Web.Mvc;
using RequireHttpsAttributeBase = System.Web.Mvc.RequireHttpsAttribute;

namespace AppHarbor.Web
{
    [AttributeUsage(
        AttributeTargets.Class | AttributeTargets.Method,
        Inherited = true,
        AllowMultiple = false)]
    public class RequireHttpsAttribute : RequireHttpsAttributeBase
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext.Request.IsSecureConnection)
            {
                return;
            }

            if (string.Equals(filterContext.HttpContext.Request.Headers["X-Forwarded-Proto"],
                "https",
                StringComparison.InvariantCultureIgnoreCase))
            {
                return;
            }

            if (filterContext.HttpContext.Request.IsLocal)
            {
                return;
            }

            HandleNonHttpsRequest(filterContext);
        }
    }
}

これで問題が解決するかどうかはわかりません。ただし、AppHarborを使用していない場合でも、根本的な原因は同じである可能性があります。その場合、上記は一見の価値があります。

于 2012-06-22T17:20:04.443 に答える
0

に変更してみてください

If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then
    secureUrl = filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1)
    filterContext.Result = new RedirectResult(secureUrl)
End If
于 2012-04-12T21:56:50.887 に答える