IIS虚拟目录获取带有过期的预签名URL

时间:2015-02-23 16:58:01

标签: c# asp.net iis amazon-s3 virtual-directory

在IIS中,有没有办法定义某种filtering rule来拒绝访问虚拟目录中的文件,除非请求是"预签名"通过某种加密的查询字符串?还有一种方法可以使请求到期吗?我无法找到控制此方法的方法。

我正在寻找的内容与Amazon S3 Amazon.S3.Model.GetPreSignedUrlRequest.Expires属性提供的内容非常相似,但在IIS中。 Here是指向Amazon S3示例代码的链接。

期望目标的情景:

请求:http://MyServerName/MyFolderThatIsAddedAsAVirtualDirectoryToDefaultWebsiteInIIS/MyImage.jpg 应始终导致"访问被拒绝"默认情况下。但是,将特定查询字符串附加到请求URL应该可以访问该文件。此外,我需要URL在一段时间后过期,直到提供新的有效查询字符串。

1 个答案:

答案 0 :(得分:2)

这里需要某种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;
    }
}