Я разрабатываю 2 сайта. Первый для загрузки изображений, а второй для хранения изображений на хостинге изображений (оба сайта используют asp.net mvc 5).

Доменное имя первого сайта следующее: vinachannel.com.

На первом сайте я хочу отправить несколько изображений на хостинг через ajax:

var f = new FormData();
$.ajax({
   url: 'https://myimagehosting.com/home/upload',
   type: 'POST',
   data: f,
   processData: false,
   contentType: false
}).done(function (data) {
   // logic...
})

Экшен Upload в контроллере Home хостинга:

[HttpPost]
public JsonResult Upload()
{
   if (Request.Files.Count > 0)
   {
      // start uploading...
   }
}

Сейчас у меня такая проблема: я хочу, чтобы хостинг изображений принимал только те запросы, которые отправлены с vinachannel.com. Например:

[HttpPost]
public JsonResult Upload()
{
   if (Request.Files.Count > 0 && Request.Url.AbsoluteUri.StartsWith("vinachannel.com"))
   {
      // start uploading...
   }
}

или используя regex:

var reg = new Regex(@"^(https://)?(www\.)?(vinachannel\.com)(.+)$");
if (Request.Files.Count > 0 && reg.IsMatch(Request.Url.AbsoluteUri))
{
   // start uploading...
}

Мой вопрос: Как я могу настроить атрибут для проверки всех запросов на действие Upload?

[VinaChannel] // only requests from site vinachannel.com
[HttpPost]
public JsonResult Upload()
{
   // ...
}

UPDATE: (на основе комментария @David и после статьи)

.
public class VinaChannelFilter : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        var reg = new Regex(@"^(https://)?(www\.)?(vinachannel\.com)(.+)$");
        if (reg.IsMatch(HttpContext.Current.Request.Url.AbsoluteUri))
        {
           // what's next here...?
        }
        this.OnActionExecuting(filterContext);
    }
}

Tân

Ответов: 2

Ответы (2)

Вы можете создать пользовательский фильтр действий, который проверяет заголовки запроса и видит, откуда пришел запрос, и использует эти значения, чтобы определить, разрешить или запретить дальнейшую обработку. Заголовок Referer - это то, что вы, возможно, захотите использовать.

public class VerifyDomain : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var expectedHost = "domainnameyouwanttocheck";
        var headers = filterContext.HttpContext.Request.Headers;

        if (!String.IsNullOrEmpty(headers["Referer"]) 
                                      && new Uri(headers["Referer"]).Host == expectedHost)
        {
            base.OnActionExecuting(filterContext);
        }
        else
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }           
    }
}

И украсьте свой метод действия/контроллер фильтром действия

[VerifyDomain]
[HttpPost]
public ActionResult Upload()
{
  // to do : return something
}

Когда доступ к этой конечной точке осуществляется не из того места, которое указано в переменной expectedHost, вызывающая сторона получит ответ 401 Unauthorized. Вы можете обновить условие if, чтобы проверить список имен ожидаемых хостов для поддержки вашей локальной среды разработки.

Upload() находится на myimagehosting.com, верно? Тогда HttpContext.Current.Request.Url.AbsoluteUri вернет Uri на домене myimagehosting.com, чтобы получить адрес источника, вам нужно получить referrer: HttpContext.Current.Request.UrlReferrer.AbsolutePath. Но проблема в том, что его можно легко подделать, поэтому, в зависимости от ваших потребностей, вам, вероятно, придется реализовать более сложную логику аутентификации/авторизации

2022 WebDevInsider