1

http と https の両方のバインディングを使用して ASP.NET MVC Web サイトをホストしたいと考えています。ただし、すべてのパスが https 経由で利用可能であるのに対し、http 経由で利用できるパスはごくわずかです。

たとえば、私のアプリケーションは次の URL を公開しています。

https://server/v1/setup
https://server/v1/exchange
https://server/v1/time

時間の URL を http 経由でも利用できるようにしたい

http://server/v1/time

IIS でルールを設定したくありません。コードで http 経由で利用可能な URL を制御する方法はありますか?

RequiresHttps 属性も調べましたが、リダイレクトの問題がいくつかあります。許可されていないパスに対して http 要求が行われた場合、応答は 404 (見つかりません) になります。

4

3 に答える 3

3

アクションフィルターを作成して、https をチェックすることができます。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class HttpsOnlyAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Called by the MVC framework before the action method executes.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            throw new HttpException(404, "HTTP/1.1 404 Not Found");
        }
    }
}

httpsのみにしたいコントローラーの上に属性を配置するだけです

[HttpsOnly]
public class SecureController : Controller
{
     // your actions here
}

アクションだけをターゲットにすることもできます

public class SampleController : Controller
{
    [HttpsOnly]
    public ActionResult SecureAction()
    {
        return View();
    }
}
于 2013-06-13T14:15:06.800 に答える
1

この場合でも、 RequireHttpsAttributeを使用できます。

これでアクションのコントローラをデコレートすると、GET リクエストがセキュア バージョンにリダイレクトされ、他のすべてのメソッドに対してエラーがスローされます。

このメソッドから拡張する場合、処理をオーバーライドして、常に 404 を返すか、デフォルトの処理を使用することができます。

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class RequireHttpsExtendedAttribute : RequireHttpsAttribute
{
    public RequireHttpsExtendedAttribute(bool throwNotFound = false)
    {
        ThrowNotFound = throwNotFound;
    }

    private bool ThrowNotFound { get; set; }

    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        if (ThrowNotFound)
            throw new HttpException(404, "HTTP/1.1 404 Not Found");

        base.HandleNonHttpsRequest(filterContext);
    }
}
于 2013-06-13T14:37:37.787 に答える