Вместо того, чтобы поместить его в общедоступный каталог, вы можете создать HTTP-обработчик, который позволит вам выполнять авторизацию.
Вы можете создать обработчик, скомпилировав и зарегистрировавшись в web.config или создав страницу ashx. Затем ваша страница авторизует пользователя, а затем записывает содержимое в ответ.
Если вам нужно состояние сеанса, обязательно наследуйте от IRequiresSessionState.
Редактировать
Я парень на C #, вот пример:
public class DownloadFile : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
//Validate user is authenticiated and authorized.
if (context.Request.IsAuthenticated)
{
//This is your own custom authorization mechanism
if (AuthorizeUser(context.Request.User))
{
//not sure what the correct content type is. This is probally wrong
context.Response.ContentType = "application/xls";
//Setting size is optional
context.Response.AddHeader("Content-Disposition",
"attachment; filename=" + downloadName + "; size=" + myExcellFile.Length.ToString());
context.Response.BinaryWrite(myExcellFile);
}
}