Я делаю что-то похожее для файлов, обслуживаемых нашей системой управления контентом. Если обработчик http включен, он проверяет имя файла и путь, чтобы определить, есть ли у пользователя доступ к ресурсу. Если пользователь это делает, он передает файл в потоковом режиме, в противном случае он возвращает 401 не авторизованного.
Я не понимаю, почему вы не можете использовать обработчик для перехода в конвейер для файла css, проверки имени хоста и потоковой передачи другого файла css (если применимо). Это просто в IIS7 со встроенным конвейером (вы не указали), но также возможно в IIS6, если вы разрешите расширение css обрабатывать .net.
Дайте мне знать, если вы заинтересованы в таком подходе, и я отследю некоторый код.
Редактировать - вот код
Это не совсем то, что вы ищете, но вы можете получить некоторые идеи.
ПРИМЕЧАНИЕ. Это в IIS7 со встроенным конвейером, поэтому в IIS6 вам придется внести изменения, чтобы файлы .css обрабатывались процессом .net.
Public Class FileManagerFileAuthorization
Implements IHttpHandler
Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
Get
Return True
End Get
End Property
Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
Dim req As HttpRequest = context.Request
Dim absolutePath As String = req.Path
Dim fileName As String = Path.GetFileName(absolutePath)
Dim physicalPathAndFileName As String = HttpContext.Current.Server.MapPath(absolutePath)
If File.Exists(physicalPathAndFileName) Then
' roles that the user is part of. If the user is not authenticated they are part of the public role only
Dim memberRoles As String()
If req.IsAuthenticated = False Then
memberRoles = New String() {ConfigurationManager.AppSettings("PublicRole")}
Else
Dim r As New Roles()
memberRoles = r.GetRolesForUser("")
End If
' check permissions: transmit file or deliver 401
Dim folderVirtualPath As String = Path.GetDirectoryName(absolutePath).Replace("\"c, "/"c)
Dim permissions As FileManager.FolderPermissions = FileManager.GetFolderPermissions(folderVirtualPath, memberRoles)
If permissions And FileManager.FolderPermissions.View Then
context.Response.ContentType = FileManager.GetContentType(fileName)
context.Response.AddHeader("Content-Length", New FileInfo(physicalPathAndFileName).Length.ToString())
context.Response.TransmitFile(physicalPathAndFileName)
Else
' unauthorized
context.Response.StatusCode = 401
End If
Else
' file not found
context.Response.StatusCode = 404
End If
context.Response.End()
End Sub
End Class
И web.config - и снова - это IIS7, так что вы будете использовать раздел <httpHandlers/>
в разделе system.web. Я ищу любой файл в каталоге Userfiles, но думаю, что вы могли бы указать файл прямо с этим.
<system.webServer>
<handlers>
<add name="FileManagerFileAuthorization" path="Userfiles*" verb="GET" type="FileManagerFileAuthorization" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
Примечание:
Чтобы разрешить .net обрабатывать файлы, отличные от .NET в IIS, необходимо разрешить процессу .net обрабатывать эти файлы. Для этого откройте диспетчер IIS, перейдите на веб-сайт и нажмите «Свойства». Перейдите на вкладку «Домашний каталог» и нажмите «Конфигурация». Добавьте сопоставление с подстановочными знаками и выберите .net dll. Если вы не уверены, скопируйте ссылку с .ascx ниже.
Поскольку это IIS6, вы не сможете использовать раздел system.webServer, описанный выше, вам нужно будет добавить обработчики http по-старому. Эта ссылка объясняет это: http://msdn.microsoft.com/en-us/library/46c5ddfy.aspx