允许本地aspnet帐户执行SharpSvn.CreateRepository

时间:2009-08-12 00:59:11

标签: asp.net svn security sharpsvn

我有一个ASP.NET Web应用程序,它试图在SharpSvn中执行CreateRepository方法,以便可以通过Web界面配置新的repos。从Visual Studio中执行应用程序时,一切运行正常,因为它在我自己的身份下运行,该身份拥有在我的本地计算机上运行的VisualSVN服务器实例的权限。但是,如果我在本地XP机器上的IIS下运行应用程序,那么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:Repository   创作失败]
  SharpSvn.SvnClientArgs.HandleResult(SvnClientContext   客户端,SvnException错误)+165
  SharpSvn.SvnClientArgs.HandleResult(SvnClientContext   客户端,svn_error_t *错误)+80
  SharpSvn.SvnRepositoryClient.CreateRepository(字符串   repositoryPath,   SvnCreateRepositoryArgs args)+828
  SharpSvn.SvnRepositoryClient.CreateRepository(字符串   repositoryPath)+53
  RepoManager.DataAccess.RepoDataAccess.CreateRepo(字符串   repoName,String projectName,Employee   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(字符串   eventArgument)+110
  System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串   eventArgument)+10
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler   sourceControl,String eventArgument)   +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection   postData)+36
  System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)+1565

看起来另一种方法是将web.config配置为模拟另一个帐户(例如域级帐户),但是当我想要做的只是授予aspnet帐户适当的权限时,它似乎很冗长。

有没有人对如何做到这一点有任何建议?什么是aspnet帐户配置,使得似乎无法授予这些权利?

我不确定这是否可以通过应用程序池标识解决,当它进入生产服务器但它仍然无法解决在IIS下本地运行的问题。

2 个答案:

答案 0 :(得分:1)

您是否检查了尝试创建存储库的位置的NTFS权限?

根据您的asp.net设置,需要创建权限的用户可以是ASP.Net/Network服务帐户或登录用户(匿名互联网用户,或者如果您使用Windows身份验证,则连接到该站点的用户) /

您可以使用web.config

中的设置强制ASP.Net作为特定用户运行

答案 1 :(得分:1)

您需要做四件事才能在运行IIS 7的Windows上运行。

  1. 清除SVN中的身份验证缓存:
  2. 即使SharpSVN不需要在机器上安装Tortoise SVN,您也需要它来清除身份验证缓存。右键单击Windows中的任何菜单> TortoiseSVN>设置>保存的数据>单击“清除”进行身份验证。如果您在该计算机(服务器)上使用Tortoise SVN,则每次单击“保存凭据”选项时都需要清除缓存,这会让人烦恼。我通常在我的开发机器上有一个配置选项来硬编码用户。

    1. 将自定义用户帐户设置为应用程序池标识用户。
    2. 管理工具> IIS 7>单击应用程序池>右键单击相应的应用程序池,然后选择高级设置>将“Identity”设置为可以通过Active Directory中的Kerberos和NTLM进行身份验证的用户帐户(这取决于浏览器以及浏览器如何建立身份验证票证)

      1. 将Web应用程序设置为使用Windows身份验证:
      2. 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
                  };