3

我有一个 ASP.NET Web 应用程序,它试图在 SharpSvn 中执行 CreateRepository 方法,以便可以通过 Web 界面配置新的存储库。从 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: 存储库创建失败]
SharpSvn.SvnClientArgs.HandleResult(SvnClientContext 客户端,SvnException 错误) +165
SharpSvn.SvnClientArgs.HandleResult(SvnClientContext 客户端,svn_error_t* 错误) +80
SharpSvn.SvnRepositoryClient.CreateRepository(String repositoryPath, SvnCreateRepositoryArgs args) +828
SharpSvn.SvnRepositoryClient.CreateRepository(String repositoryPath) +53
RepoManager.DataAccess.RepoDataAccess.CreateRepo(String repoName, String projectName, Employee creatorEmployee) +183
RepoManager.Web.Default.SubmitButton_Click(Object sender, 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 sourceControl,字符串 eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36
System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+1565

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

有人对如何做到这一点有任何建议吗?是什么让 aspnet 帐户配置看似不可能授予这些权限?

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

4

2 回答 2

1

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

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

您可以使用 web.config 中的设置强制 ASP.Net 以特定用户身份运行

于 2009-09-10T22:32:07.887 回答
1

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

  1. 清除 SVN 中的身份验证缓存:

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

  1. 将自定义用户帐户设置为应用程序池身份用户。

管理工具 > IIS 7 > 单击应用程序池 > 右键单击​​相应的应用程序池并选择高级设置 > 将“身份”设置为可以通过 Active Directory 中的 Kerberos 和 NTLM 进行身份验证的用户帐户(这取决于浏览器和浏览器的运行方式建立身份验证票证)

  1. 将 Web 应用程序设置为使用 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
            };
    
于 2014-09-23T20:32:42.440 回答