我正在通過控制器操作方法進行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;
}
您不應該將「祕密」與請求一起發送。這否定了「祕密」的全部目的。發佈該祕密以允許您加密或以其他方式保護您對API的請求,例如生成HMAC以防止重播攻擊。 –
@ChrisPratt - 非常真實,我只是想讓OP非常簡單,假設他會對此做進一步的研究;我會更新我的答案/請隨時更新。感謝您指出這一點。 – Developer