68

WebApi に SSL を要求する方法はありますか? 属性?

の下に、 MVC 用System.Web.Httpの属性のような該当する属性がありません。RequireHttps組み込みのソリューションがある場合、独自の属性/メッセージハンドラーをローリングしないようにしています。

4

6 に答える 6

52
public class RequireHttpsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
        }
    }
}
于 2013-05-01T09:37:23.243 に答える
47

WebAPIContrib プロジェクトのRequireHttpsHandlerを使用できます。基本的には、着信リクエストの URI スキームをチェックするだけです。

if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
  // Forbidden (or do a redirect)...
}

または、Carlos Figueira が彼の MSDN ブログで別の実装を紹介しています。

于 2012-06-29T20:25:05.080 に答える
20

ASP.NET Web API に ASP.NET MVC RequireHttps 属性に相当するものがないのは不可解です。ただし、MVCのRequireHttpsに基づいて簡単に作成できます。

using System;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

...

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext == null)
        {
            throw new ArgumentNullException("actionContext");
        }

        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            HandleNonHttpsRequest(actionContext);
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }

    protected virtual void HandleNonHttpsRequest(HttpActionContext actionContext)
    {
        actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
        actionContext.Response.ReasonPhrase = "SSL Required";
    }
}

あとは、冗長なコードがどれだけあるかについて議論するだけです。

于 2013-09-12T14:59:12.093 に答える
2

次のフィルタ クラスを使用して、アクション メソッドに SSL を強制的に使用させることができます。これにより、リクエストが GET メソッドまたはその他の動詞で処理されます。get メソッドの場合は、(ロケーション ヘッダーを使用して) ブラウザーを新しいものにリダイレクトします。 URI。それ以外の場合は、https を使用するようにメッセージが表示されます

以下のコードは、AuthorizationFilterAttribute から継承した後に OnAuthorization メソッドをオーバーライドする必要があることを示しています。

        string _HtmlBody = string.Empty;
        UriBuilder httpsNewUri;

        var _Request = actionContext.Request;

        if (_Request.RequestUri.Scheme != Uri.UriSchemeHttps )
        {

            _HtmlBody = "<p>Https is required</p>";

            if (_Request.Method.Method == "GET"){

                actionContext.Response = _Request.CreateResponse(HttpStatusCode.Found);
                actionContext.Response.Content = new StringContent(_HtmlBody, Encoding.UTF8, "text/html");

                httpsNewUri = new UriBuilder(_Request.RequestUri);
                httpsNewUri.Scheme = Uri.UriSchemeHttps;
                httpsNewUri.Port = 443;

                //To ask a web browser to load a different web page with the same URI but different scheme and port
                actionContext.Response.Headers.Location = httpsNewUri.Uri;


            }else{

                actionContext.Response = _Request.CreateResponse(HttpStatusCode.NotFound);
                actionContext.Response.Content = new StringContent(_HtmlBody, Encoding.UTF8, "text/html");

            }
}
于 2015-01-03T13:32:03.393 に答える
1

次のコードを使用できます。(自動的に https にリダイレクト) http ベースのリクエストが行われたときに https にリダイレクトします。

Visual Studio で確認するには、Visual Studio で ssl を有効にする必要があります。これは、enable ssl プロパティを true に設定することで実行できます。

public class RequireHttpsAttribute: AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if(actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            // constructing the https url
            var uriBuilder = new UriBuilder(actionContext.Request.RequestUri)
            {
                Scheme = Uri.UriSchemeHttps,
                Port = 44353 // port used in visual studio for this 
            };

            actionContext.Response.Headers.Location = uriBuilder.Uri;
        }
    }
}

このようにRegisterメソッドでこれを使用します

config.Filters.Add(new RequireHttpsAttribute());
于 2017-06-27T14:38:10.477 に答える