WebApi に SSL を要求する方法はありますか? 属性?
の下に、 MVC 用System.Web.Http
の属性のような該当する属性がありません。RequireHttps
組み込みのソリューションがある場合、独自の属性/メッセージハンドラーをローリングしないようにしています。
WebApi に SSL を要求する方法はありますか? 属性?
の下に、 MVC 用System.Web.Http
の属性のような該当する属性がありません。RequireHttps
組み込みのソリューションがある場合、独自の属性/メッセージハンドラーをローリングしないようにしています。
public class RequireHttpsAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
}
}
}
WebAPIContrib プロジェクトのRequireHttpsHandlerを使用できます。基本的には、着信リクエストの URI スキームをチェックするだけです。
if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
// Forbidden (or do a redirect)...
}
または、Carlos Figueira が彼の MSDN ブログで別の実装を紹介しています。
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";
}
}
あとは、冗長なコードがどれだけあるかについて議論するだけです。
次のフィルタ クラスを使用して、アクション メソッドに 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");
}
}
次のコードを使用できます。(自動的に 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());