在 Application_BeginRequest 攔截請求,依 Referer、Cookie、登入狀態判斷是否允許下載;不允許時用 Context.RewritePath 導向驗證頁或錯誤頁。配合 IIS 將目標副檔名(如 .rar、.zip)對應到 aspnet_isapi.dll,讓靜態檔案也經過 ASP.NET 管線。
<?xml version="1.0" encoding="utf-8"?>
<DownLoad>
<CheckType>3</CheckType> <!-- 1=Referer, 2=Cookie, 3=兩者皆驗 -->
<CookiesName>AuthToken</CookiesName>
<UrlPattern><![CDATA[//(.+?)/.rar]]></UrlPattern>
<UrlReplace><![CDATA[/Error/Unauthorized.aspx?file=$1.rar]]></UrlReplace>
<AllowHost><![CDATA[example.com|partner.com]]></AllowHost>
</DownLoad>
void Application_BeginRequest(object sender, EventArgs e)
{
var configPath = ConfigurationManager.AppSettings["DownLoadConfig"];
if (string.IsNullOrEmpty(configPath)) return;
var doc = new XmlDocument();
doc.Load(Server.MapPath(configPath));
int checkType = int.Parse(doc.SelectSingleNode("DownLoad/CheckType")?.InnerText ?? "1");
string cookieName = doc.SelectSingleNode("DownLoad/CookiesName")?.InnerText ?? "AuthToken";
string allowHosts = doc.SelectSingleNode("DownLoad/AllowHost")?.InnerText ?? "";
string urlPattern = doc.SelectSingleNode("DownLoad/UrlPattern")?.InnerText ?? "";
string urlReplace = doc.SelectSingleNode("DownLoad/UrlReplace")?.InnerText ?? "";
bool allowReferer = false;
if (Request.UrlReferrer != null)
{
string refererHost = Request.UrlReferrer.Host.ToLower();
allowReferer = allowHosts.Split('|').Any(h => h.Equals(refererHost, StringComparison.OrdinalIgnoreCase));
}
bool allowCookie = !string.IsNullOrEmpty(Request.Cookies[cookieName]?.Value);
bool allow = checkType switch
{
1 => allowReferer,
2 => allowCookie,
3 => allowReferer && allowCookie,
_ => false
};
if (!allow && Regex.IsMatch(Request.RawUrl, urlPattern, RegexOptions.IgnoreCase))
{
string newUrl = Regex.Replace(Request.RawUrl, urlPattern, urlReplace, RegexOptions.IgnoreCase);
Context.RewritePath(newUrl);
}
}
<appSettings>
<add key="DownLoadConfig" value="~/DownLoad.config" />
</appSettings>
.rar,執行檔 C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll(依實際 .NET 版本)。<system.webServer>
<handlers>
<add name="StaticFileRewrite" path="*.rar" verb="*"
type="System.Web.HttpApplication" preCondition="integratedMode" />
</handlers>
</system.webServer>
/download/file.rar?token=xxx&exp=timestamp),不依賴 Referer(易偽造)。Response.TransmitFile 或 FileStream 分塊傳輸,支援斷點續傳。ASP.NET Core 可用 Middleware + PhysicalFileProvider + Signed URL 實現更簡潔、高效能的防盜鏈,無需 IIS 特殊映射。