Виртуальный каталог IIS Получить предварительно подписанный URL с истечением срока действия

В IIS, есть ли способ определить какое-то правило фильтрации, чтобы запретить доступ к файлам в виртуальном каталоге, если запросы не "предварительно подписаны" какой-то зашифрованной строкой запроса? Также есть ли способ заставить запрос истечь? Я не могу найти способ контролировать это.

То, что я ищу, очень похоже на то, что Amazon S3 Amazon.S3.Model.GetPreSignedUrlRequest.Expires имущество доставляет, но в IIS. Вот ссылка на пример кода Amazon S3.

Сценарий желаемой цели:

Запрос: http://MyServerName/MyFolderThatIsAddedAsAVirtualDirectoryToDefaultWebsiteInIIS/MyImage.jpg по умолчанию всегда должен приводить к "Отказано в доступе". Тем не менее, добавление определенной строки запроса к URL запроса должно дать доступ к файлу. Кроме того, мне нужно, чтобы URL истек через определенный период времени, пока не будет предоставлена ​​новая действительная строка запроса.

1 ответ

Решение

Вам понадобится какой-то HTTP-модуль, чтобы справиться с этим, поскольку для сопоставления и истечения срока действия QueryString существует настраиваемая логика.

  public class HttpFilterModule : IHttpModule
  {
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        var qs = HttpContext.Current.Request.QueryString["SomeKeyToCheck"];
        var url = HttpContext.Current.Request.Url;

        if (MatchesUrl(url))
        {
            if (!IsAuthenticatedByQueryString(qs))
            {
                HttpContext.Current.Response.StatusCode = HttpStatusCode.Unauthorized;
                HttpContext.Current.Response.End();
            }
        }
    }

    private bool IsAuthenticatedByQueryString(string qs)
    {
        //  implement code here to check qs value
        //  probably against a DB or cache of tokens
        return true;
    }

    private bool MatchesUrl(Uri url)
    {
        //  implement code here to match the URL, 
        //  probably against configuration
        return true;
    }
}
Другие вопросы по тегам