IIS 虚拟目录获得预签名 URL 并过期
IIS Virtual Directory Get Pre Signed URL with Expiration
在 IIS 中,有没有办法定义某种 filtering rule 来拒绝访问虚拟目录中的文件,除非请求是 "pre signed" 通过某种加密查询字符串?还有没有办法让请求过期?我找不到控制它的方法。
我正在寻找的与 Amazon S3 Amazon.S3.Model.GetPreSignedUrlRequest.Expires
属性 提供的非常相似,但在 IIS 中。 Here 是对 Amazon S3 示例代码的 link。
期望目标场景:
请求:http://MyServerName/MyFolderThatIsAddedAsAVirtualDirectoryToDefaultWebsiteInIIS/MyImage.jpg
默认情况下应始终导致 "Access Denied"。但是,将特定查询字符串附加到请求 URL 应该可以访问该文件。另外,我需要 URL 在一段时间后过期,直到提供新的有效查询字符串。
您将需要某种 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;
}
}
在 IIS 中,有没有办法定义某种 filtering rule 来拒绝访问虚拟目录中的文件,除非请求是 "pre signed" 通过某种加密查询字符串?还有没有办法让请求过期?我找不到控制它的方法。
我正在寻找的与 Amazon S3 Amazon.S3.Model.GetPreSignedUrlRequest.Expires
属性 提供的非常相似,但在 IIS 中。 Here 是对 Amazon S3 示例代码的 link。
期望目标场景:
请求:http://MyServerName/MyFolderThatIsAddedAsAVirtualDirectoryToDefaultWebsiteInIIS/MyImage.jpg 默认情况下应始终导致 "Access Denied"。但是,将特定查询字符串附加到请求 URL 应该可以访问该文件。另外,我需要 URL 在一段时间后过期,直到提供新的有效查询字符串。
您将需要某种 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;
}
}