私は以下のようなコントローラアクションメソッドを使ってapi呼び出しを行っています。以下は、その作業コードです。 しかし私は自分のアプリケーションだけがアクセスできるようにwebapiを保護したいと思います。私はログイン資格情報 でソースを見たことがありますが、私の場合はログインユーザーがいない一般公開のウェブサイトです。 アプリケーションからの呼び出しにのみアクセスする必要があります。誰でも何ができるのかを教えてください。またはValidateReferrerを使用している私の現在のコードで十分ですか?コントローラで私のアプリだけがそれにアクセスできるようにmvc5 c#webapiを許可してください
[HttpGet]
[ValidateReferrer]
[ActionName("GetFind")]
[CacheOutput(ClientTimeSpan = 300, ServerTimeSpan = 300)]
public ApiQueryResponse GetFind(string query)
{
return _Worker.GetFind(query);
}
検証リファラーは、次の実装があります。ワーカークラスで
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext == null)
{
throw new System.Web.HttpException("No Http context, request not allowed.");
}
else
{
if (filterContext.HttpContext.Request.UrlReferrer == null)
{
throw new System.Web.HttpException("Referrer information missing, request not allowed.");
}
else if (filterContext.HttpContext.Request.UrlReferrer.Host != filterContext.HttpContext.Request.Url.Host)
{
throw new System.Web.HttpException(string.Format("Possible cross site request forgery attack, request sent from another site: {0}", filterContext.HttpContext.Request.UrlReferrer.Host));
}
}
}
、
public ApiQueryResponse GetFind(string query)
{
var results = GetResults(Settings.ApiKey, SetFindParameters(query), Resource);
return results;
}
private ApiQueryResponse GetResults(string apiKey, string parameterQuery, string Resource)
{
var results = new ApiQueryResponse();
if (apiKey != null && !String.IsNullOrWhiteSpace(apiKey))
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync(string.Format("{0}/{1}?{2}&key={3}", WebApiUrl, Resource, parameterQuery, apiKey)).Result;
if (response.IsSuccessStatusCode)
{
var responseBodyAsText = response.Content.ReadAsStringAsync().Result;
results = JsonConvert.DeserializeObject<ApiQueryResponse>(responseBodyAsText);
}
}
}
return results;
}
「秘密」を要求とともに送信しないでください。それは「秘密」の目的をすべて否定します。シークレットは、リプレイ攻撃を防ぐためにHMACを生成するなど、APIに対する要求を暗号化または保護するために発行されます。 –
@ChrisPratt - 私はちょうど彼がこれについてさらに研究をすると仮定して、OPのためにそれを本当に簡単にするようにしていました。私は私の答えを更新する/更新する気軽にしてください。これを指摘していただきありがとうございます。 – Developer