Удаленный доступ к файлам SharePoint 2007 запрещен CAS
У меня есть код, выполняющийся в ascx в PageLayout в SharePoint 2007, который обращается к файлам на удаленном сервере, например File.Create("\servername\sharename\folder\file.txt"). Код выполняется в веб-приложении SharePoint, для которого для доверия CAS установлено значение Full в файле web.config. File.Create выдает следующее исключение:
System.UnauthorizedAccessException
Доступ к пути \\servername\sharename\folder\file.txt запрещен.
Общая папка доступна всем пользователям с полным доступом, а разрешения NTFS установлены для всех пользователей с полным доступом. Пул приложений веб-приложения работает под учетной записью домена, также с явными разрешениями на доступ к этому ресурсу (не обязательно).
Я запустил Process Monitor на удаленной машине, и на сервере не было записано ни одного обращения. Это наводит меня на мысль, что это проблема с настройками безопасности доступа к коду SharePoint. Как я уже говорил выше, доверие к web.config установлено на Full.
Возможно ли, что CAS все еще блокирует удаленный доступ? Кто-нибудь может придумать какую-нибудь другую область для обзора?
Обновить
Немного больше информации...
Я попытался сделать пул приложений администратором домена acct, и проблема все еще возникает. При использовании того же метода для доступа к диску на локальной машине он работает нормально. Выполнение того же кода в SnippetCompiler за пределами sharepoint с использованием учетной записи пула приложений работает нормально.
Надеюсь, это поможет, дайте мне знать, если вы можете подумать о каких-либо других направлениях исследований или испытаний, которые я могу попробовать
Обновить
Я не уверен, если это повлияет на проблему, но локальный сервер работает под управлением Windows Server 2003, а удаленный сервер работает под управлением Windows 2000.
Обновить
Я только что попытался запустить код через веб-часть, и он работает нормально. Структура файла, которую я использую в проекте, который терпит неудачу, выглядит следующим образом:
wss
- VirtualDirectories
- SharePointWebApp
- ...sp web app files
- .
- .
- PageLayoutControls
- control.ascx
- .
- .
Тогда в IIS у меня есть следующая структура:
IIS
- Websites
- SharePointWebApp (pointing to \wss\VirtualDirectories\SharePointWebApp)
- PageLayoutControls (virtual directory pointing to \wss\VirtualDirectories\PageLayoutControls)
Затем в рамках PageLayouts я ссылаюсь на элементы управления, используя следующее:-
<%@ Register TagPrefix="TEST" TagName="MyControl" Src="~/PageLayoutControls/control.ascx" %>
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">
<TEST:MyControl id="myControl" runat="server"/>
</asp:Content>Let me know if you need more info.
Обновить
Тайна углубляется...
Когда я получаю доступ к сайту sharepoint из Internet Explorer (6 или 7) на сервере переднего плана SharePoint, я НЕ получаю исключение.
Когда я захожу на сайт sharepoint из Mozilla Firefox с внешнего веб-сервера SP, я действительно получаю исключение.
Когда я получаю доступ к сайту sharepoint удаленно из ЛЮБОГО браузера, я получаю исключение.
Кроме того, не имеет значения, какого пользователя я использую для входа на сайт, если у него есть разрешения на доступ к сайту sharepoint.
Какие-нибудь мысли?
Обновить
Хм, теперь я обнаружил, что если я получаю доступ к сайту sharepoint удаленно и сайт sharepoint пытается выполнить File.Create() локально (то есть File.Create("C:\temp\abc.txt")), тогда он работает, Если я получаю доступ к сайту sharepoint из поля sharepoint и выполняю File.Create() удаленно (то есть File.Create("\ServerName\ShareName\FolderName\file.txt")), тогда он работает.
Сбой происходит только тогда, когда я получаю доступ к сайту sharepoint удаленно, и сайт sharepoint пытается также выполнить File.Create() удаленно. Вроде проблемы с двойным прыжком. Это заставляет меня думать, что это может быть проблемой NTLM / Kerberos.
В настоящее время мы работаем с использованием аутентификации NTLM.
Кто-нибудь еще сталкивался с такой проблемой?
Обновить
Да, я почти уверен, что это проблема NTLM, не допускающая двойной скачок. Я просто изменил аутентификацию на сайте sharepoint, чтобы использовать обычную аутентификацию, и она сработала. Изменил его обратно на встроенную аутентификацию, и это не удалось.
Теперь нужно решить, следует ли перенести ферму на использование Kerberos или найти другой способ решения проблемы.:-/
Обновить
Просто даю SPSecurity.RunWithElevatedPrivileges шанс. Одна вещь, хотя, RunWithElevatedPrivileges предназначен для использования в этом контексте? Ранее я использовал его только для получения доступа к спискам и библиотекам в SharePoint, а не для доступа к файлам в сети.
Какие-нибудь мысли?
Обновить
Да, SPSecurity.RunWithElevatedPrivileges решает проблему.:-)
1 ответ
Интересно, если это проблема двойного прыжка и ваш код пытается получить доступ к ресурсу от имени другого пользователя, но это не удается, потому что NTLM не будет выдавать себя за другой сервер (Kerberos будет).
Вы пробовали SPSecurity.RunWithElevatedPrivileges? Это уберет олицетворение (RevertToSelf), и тогда, возможно, владелец пула приложений может просто действовать как он сам, тогда как, может быть, раньше не мог.
Просто мысль и должно быть довольно легко попробовать.