3 Stimmen

Erlauben des lokalen Aspnet-Kontos, SharpSvn.CreateRepository auszuführen

Ich habe eine ASP.NET-Webanwendung, die versucht, die CreateRepository-Methode in SharpSvn auszuführen, so dass neue Repos über eine Webschnittstelle bereitgestellt werden können. Alles läuft gut, wenn die App von Visual Studio aus ausgeführt wird, da sie unter meiner eigenen Identität läuft, die Rechte auf die VisualSVN-Serverinstanz hat, die auf meinem lokalen Rechner läuft. Wenn ich die Anwendung jedoch unter IIS auf meinem lokalen XP-Rechner ausführe, wird der asp.net Worker-Prozess unter dem lokalen aspnet-Konto ausgeführt, dem ich scheinbar nicht die Rechte zum Erstellen von Repositories erteilen kann. Egal, wie weit ich die Rechte erweitere (sogar in die lokalen Admin- oder VisualSVN-Administratorgruppen), SharpSvn löst ständig eine SvnAuthorizationException aus und ich erhalte einen entsprechenden Eintrag im Sicherheitsereignisprotokoll unter dem aspnet-Konto.

Der Code läuft folgendermaßen ab:

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

Das Ergebnis ist dieser Stack-Trace:

[SvnAuthorizationException: Can't Verzeichnis erstellen ' E:\Repositories\TestRepoName ': Der Zugriff wird verweigert. ]

[SvnAuthorizationException: Konnte nicht Top-Level-Verzeichnis erstellen]

[SvnAuthorizationException: Repository Erstellung fehlgeschlagen]
SharpSvn.SvnClientArgs.HandleResult(SvnClientContext client, SvnException error) +165
SharpSvn.SvnClientArgs.HandleResult(SvnClientContext client, svn_error_t* error) +80
SharpSvn.SvnRepositoryClient.CreateRepository(String repositoryPath, SvnCreateRepositoryArgs args) +828
SharpSvn.SvnRepositoryClient.CreateRepository(String repositoryPath) +53
RepoManager.DataAccess.RepoDataAccess.CreateRepo(String repoName, String projectName, Mitarbeiter 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, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

Es sieht so aus, als ob eine Alternative darin besteht, die web.config so zu konfigurieren, dass sie ein anderes Konto verkörpert (z. B. ein Konto auf Domänenebene), aber das scheint sehr umständlich zu sein, wenn ich nur dem aspnet-Konto die entsprechenden Rechte gewähren möchte.

Hat jemand einen Vorschlag, wie man das machen kann? Was hat es mit der Konfiguration des Aspnet-Kontos auf sich, dass es scheinbar unmöglich ist, diese Rechte zu gewähren?

Ich bin nicht sicher, ob dies durch die App-Pool-Identität angegangen werden kann, wenn dies auf einen Produktionsserver geht, aber es immer noch nicht die Probleme lokal unter IIS laufen.

1 Stimmen

Wenn Sie den Stack-Trace posten (und vielleicht etwas Code zu dem, was Sie zu tun versuchen), haben Sie eine bessere Chance auf eine Antwort.

1voto

Bert Huijben Punkte 19285

Haben Sie die NTFS-Berechtigungen für den Speicherort überprüft, an dem Sie versuchen, das Repository zu erstellen?

Abhängig von Ihren Asp.Net-Einstellungen ist der Benutzer, der dort Rechte erstellen muss, entweder das ASP.Net/Netzwerkdienst-Konto oder der angemeldete Benutzer (der anonyme Internetbenutzer oder der mit der Website verbundene Benutzer, wenn Sie die Windows-Authentifizierung verwenden).

Mit den Einstellungen in der web.config können Sie ASP.Net zwingen, als ein bestimmter Benutzer zu laufen

1voto

MacGyver Punkte 17368

Damit dies unter Windows mit IIS 7 funktioniert, müssen Sie vier Dinge tun.

  1. Löschen Sie den Authentifizierungs-Cache in SVN:

Auch wenn SharpSVN nicht voraussetzt, dass Tortoise SVN auf dem Rechner installiert ist, benötigen Sie es, um den Authentifizierungscache zu löschen. Klicken Sie mit der rechten Maustaste auf ein beliebiges Menü in Windows > TortoiseSVN > Einstellungen > Gespeicherte Daten > klicken Sie auf "Löschen" für Authentifizierung. Wenn Sie Tortoise SVN auf diesem Rechner (Server) verwenden, müssen Sie den Cache jedes Mal löschen, wenn Sie auf die Option "Anmeldedaten speichern" klicken, was lästig ist. Ich habe normalerweise eine Konfigurationsoption auf meinem Entwicklungsrechner, um den Benutzer fest zu kodieren.

  1. Legen Sie ein benutzerdefiniertes Benutzerkonto als Identitätsbenutzer für den Anwendungspool fest.

Verwaltung > IIS 7 > Klicken Sie auf Anwendungspools > klicken Sie mit der rechten Maustaste auf den entsprechenden Anwendungspool und wählen Sie Erweiterte Einstellungen > setzen Sie die "Identität" auf ein Benutzerkonto, das sich über Kerberos und NTLM in Active Directory authentifizieren kann (dies hängt vom Browser ab und davon, wie der Browser Authentifizierungstickets erstellt)

  1. Legen Sie fest, dass die Webanwendung die Windows-Authentifizierung verwendet:

IIS 7 > Website anklicken > Authentifizierung > Alles deaktivieren, dann "Windows-Authentifizierung" aktivieren

  1. Verwenden Sie diesen Code zur Authentifizierung.

            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
            };

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X