Разрешение локальной учетной записи aspnet выполнять SharpSvn.CreateRepository

У меня есть веб-приложение ASP.NET, которое пытается выполнить метод CreateRepository в SharpSvn, чтобы новые репозитории можно было предоставлять через веб-интерфейс. Все работает нормально при выполнении приложения из Visual Studio, поскольку оно работает под моей собственной учетной записью, у которой есть права на экземпляр сервера VisualSVN, работающий на моем локальном компьютере. Однако, если я запускаю приложение под IIS на своем локальном компьютере с XP, рабочий процесс asp.net выполняется под локальной учетной записью aspnet, которой я не могу предоставить права на создание репозиториев. Как бы далеко я не расширял права (даже в локальную админку или админку VisualSVN), SharpSvn постоянно выбрасывает SvnAuthorizationException и я получаю соответствующую запись в журнале событий безопасности под учетной записью aspnet.

Вот что делает код:

string repoPath = string.Format("{0}{1}", repoFolderPath, repoName);
using (var svnRepoClient = new SvnRepositoryClient())
{
  svnRepoClient.LoadConfiguration(repoPath);
  svnRepoClient.CreateRepository(repoPath);
}

Что приводит к этой трассировке стека:

[SvnAuthorizationException: не удается создать каталог «E:\Repositories\TestRepoName»: доступ запрещен. ]

[SvnAuthorizationException: не удалось создать каталог верхнего уровня]

[SvnAuthorizationException: Ошибка создания репозитория]
SharpSvn.SvnClientArgs.HandleResult(клиент SvnClientContext, ошибка SvnException) +165
SharpSvn.SvnClientArgs.HandleResult(клиент SvnClientContext, ошибка svn_error_t*) +80
SharpSvn.SvnRepositoryClient.CreateRepository (Структурный путь к репозиторию, аргументы SvnCreateRepositoryArgs) +828
SharpSvn.SvnRepositoryClient.CreateRepository(Строковый путь к репозиторию) +53
RepoManager.DataAccess.RepoDataAccess.CreateRepo(Строковый репоИмя, Строковый проектИмя, Сотрудник CreatorEmployee) +183
RepoManager. Web.Default.SubmitButton_Click(Отправитель объекта, EventArgs e) +357
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(источник IPostBackEventHandler) eControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) +1565

Похоже, что альтернативой является настройка web.config для олицетворения другой учетной записи (например, учетной записи уровня домена), но это кажется многословным, когда все, что я хочу сделать, это предоставить учетной записи aspnet соответствующие права.

Есть ли у кого-нибудь предложения о том, как это можно сделать? Что такого в конфигурации учетной записи aspnet, что делает невозможным предоставление этих прав?

Я не уверен, можно ли решить эту проблему с помощью идентификатора пула приложений, когда он переходит на рабочий сервер, но он по-прежнему не решает проблемы, работающие локально в IIS.


person Troy Hunt    schedule 12.08.2009    source источник
comment
Если вы опубликуете трассировку стека (и, возможно, некоторый код того, что вы пытаетесь сделать), у вас больше шансов получить ответ.   -  person Bert Huijben    schedule 14.08.2009


Ответы (2)


Вы проверяли разрешения NTFS в месте, где вы пытаетесь создать репозиторий?

В зависимости от ваших настроек asp.net пользователь, которому требуются права на создание, является либо учетной записью ASP.Net/Network Service, либо пользователем, вошедшим в систему (анонимный пользователь Интернета или пользователь, подключенный к сайту, если вы используете проверку подлинности Windows)/

Вы можете заставить ASP.Net работать от имени конкретного пользователя с настройками в файле web.config.

person Bert Huijben    schedule 10.09.2009

Чтобы это работало в Windows с IIS 7, вам нужно сделать четыре вещи.

  1. Очистить кеш аутентификации в SVN:

Несмотря на то, что SharpSVN не требует установки Tortoise SVN на компьютере, он понадобится вам для очистки кэша аутентификации. Щелкните правой кнопкой мыши любое меню в Windows> TortoiseSVN> Настройки> Сохраненные данные> нажмите «Очистить» для аутентификации. Если вы используете Tortoise SVN на этом компьютере (сервере), вам нужно будет очищать кеш каждый раз, когда вы нажимаете опцию «Сохранить учетные данные», что раздражает. Обычно у меня есть опция конфигурации на моей машине разработки для жесткого кодирования пользователя.

  1. Установите настраиваемую учетную запись пользователя в качестве пользователя удостоверения пула приложений.

Инструменты администрирования> IIS 7> щелкните пулы приложений> щелкните правой кнопкой мыши соответствующий пул приложений и выберите «Дополнительные параметры»> установите «Идентификация» для учетной записи пользователя, которая может проходить аутентификацию через Kerberos и NTLM в Active Directory (это зависит от браузера и от того, как браузер установление билетов аутентификации)

  1. Настройте веб-приложение на использование проверки подлинности Windows:

IIS 7> щелкните веб-сайт> Аутентификация> Отключить все, затем включите «Аутентификация Windows».

  1. Используйте этот код для аутентификации.

            client.LoadConfiguration(Path.Combine(Path.GetTempPath(), "Svn"), true);
    
            client.Authentication.Clear();
            client.Authentication.UserNamePasswordHandlers
                += delegate(object obj, SharpSvn.Security.SvnUserNamePasswordEventArgs args)
                {
                    args.UserName = System.Configuration.ConfigurationManager.AppSettings["svn_user"].ToString();
                    args.Password = System.Configuration.ConfigurationManager.AppSettings["svn_pass"].ToString();
                };
    
            client.Authentication.SslServerTrustHandlers +=
            delegate(object sender, SvnSslServerTrustEventArgs e)
            {
                e.AcceptedFailures = e.Failures;
                e.Save = true; // Save acceptance to authentication store
            };
    
person MacGyver    schedule 23.09.2014