In der heutigen digitalisierten Arbeitswelt ist die Automatisierung von Prozessen unerlässlich. Ob es darum geht, Berichte automatisch in einer zentralen Ablage zu speichern, Dokumente aus einer Drittanwendung zu archivieren oder Medieninhalte hochzuladen – die Interaktion mit SharePoint ist dabei oft ein Kernbestandteil. Doch wie ermöglicht man einer eigenen Anwendung, sei es ein Desktop-Programm, ein Webdienst oder ein Skript, sicher und benutzerfreundlich auf SharePoint zuzugreifen, insbesondere wenn ein Dateiupload ansteht? Die Antwort liegt in der intelligenten Nutzung der Azure AD Authentifizierung mit einem interaktiven Login-Prompt.
Dieser Artikel führt Sie Schritt für Schritt durch den Prozess, wie Sie Ihre Anwendung so konfigurieren und implementieren, dass sie sich per Login-Prompt bei SharePoint anmelden und anschließend Dateien hochladen kann. Wir beleuchten die technischen Grundlagen, geben praktische Anleitungen und decken Best Practices ab.
Warum eine Anwendung anmelden und nicht einfach ein Nutzerpasswort verwenden?
Bevor wir ins Detail gehen, klären wir, warum der Weg über eine registrierte Anwendung der goldene Standard ist und das direkte Verwenden von Benutzername und Passwort vermieden werden sollte:
- Sicherheit: Passwörter werden nicht direkt in der Anwendung gespeichert oder übertragen. Stattdessen werden sichere Token verwendet.
- Granulare Berechtigungen: Einer Anwendung können spezifische Berechtigungen erteilt werden, die genau auf ihre Aufgabe zugeschnitten sind (z.B. nur das Hochladen von Dateien in einen bestimmten Ordner), ohne dass sie die volle Kontrolle eines Benutzers erhält.
- Compliance & Auditability: Die Aktionen einer Anwendung können im Azure AD Audit-Log nachverfolgt werden.
- Benutzerfreundlichkeit: Ein Login-Prompt ist ein etabliertes Muster, das Benutzern vertraut ist und eine sichere Einmalanmeldung ermöglicht.
- Trennung der Verantwortlichkeiten: Applikationen agieren im Kontext von Benutzern, benötigen aber nicht deren Identität im Hintergrund.
Grundlagen der SharePoint-Authentifizierung im Kontext von Azure AD
SharePoint Online ist tief in Microsoft 365 und damit in Azure Active Directory (Azure AD) integriert. Azure AD dient als zentraler Identitätsanbieter und nutzt Protokolle wie OAuth 2.0 und OpenID Connect, um Anwendungen den sicheren Zugriff auf Microsoft-Dienste zu ermöglichen. Wenn wir von einem „Login-Prompt” sprechen, meinen wir in der Regel einen interaktiven Authentifizierungsfluss, bei dem der Benutzer über eine Browser-basierte Oberfläche seine Identität bestätigt und der Anwendung die erforderlichen Berechtigungen erteilt (Zustimmung oder „Consent”).
Der „Login-Prompt” – Was bedeutet das eigentlich?
Ein Login-Prompt ist die sichtbare Schnittstelle für den Benutzer, um sich bei Microsoft anzumelden und der Anwendung den Zugriff auf bestimmte Ressourcen zu gestatten. Dies geschieht in der Regel über ein Pop-up-Fenster oder eine Browser-Weiterleitung, die den Benutzer zur Microsoft-Anmeldeseite führt. Nachdem der Benutzer seine Anmeldeinformationen eingegeben und eventuell die Multi-Faktor-Authentifizierung (MFA) abgeschlossen hat, fordert Microsoft ihn auf, der Anwendung die angefragten Berechtigungen zu erteilen. Erst danach erhält die Anwendung ein Zugriffstoken (Access Token), mit dem sie im Namen des Benutzers auf SharePoint zugreifen kann.
Schritt 1: Ihre Anwendung im Azure AD registrieren
Der erste und grundlegendste Schritt ist die Registrierung Ihrer Anwendung im Azure Active Directory. Dies ist vergleichbar mit dem Anlegen einer „Identität” für Ihre Software.
- Azure-Portal aufrufen: Navigieren Sie zu portal.azure.com und melden Sie sich mit einem Konto an, das über die Berechtigung verfügt, Anwendungen zu registrieren (z.B. Global Administrator oder Application Developer).
- Anwendungsregistrierungen auswählen: Suchen Sie im Suchfeld nach „App-Registrierungen” oder navigieren Sie über das Menü zu „Azure Active Directory” > „App-Registrierungen”.
- Neue Registrierung: Klicken Sie auf „Neue Registrierung”.
- Name: Geben Sie einen aussagekräftigen Namen für Ihre Anwendung ein (z.B. „SharePoint File Uploader App”).
- Unterstützte Kontotypen: Wählen Sie, wer Ihre Anwendung nutzen kann. Für die meisten Szenarien wählen Sie „Nur Konten in diesem Organisationsverzeichnis” oder „Konten in einem beliebigen Organisationsverzeichnis und persönliche Microsoft-Konten”.
- Umleitungs-URI (Redirect URI): Dies ist entscheidend für den Login-Prompt. Hierher wird der Benutzer nach erfolgreicher Authentifizierung umgeleitet, und hier erhält Ihre Anwendung die Authentifizierungsinformationen.
- Für Desktop- oder Mobilanwendungen: Wählen Sie als Plattform „Mobile und Desktopanwendungen” und fügen Sie als Umleitungs-URI `https://login.microsoftonline.com/common/oauth2/nativeclient` oder `http://localhost` hinzu (MSAL-Bibliotheken verwalten dies oft automatisch mit einem zufälligen Port).
- Für Webanwendungen: Wählen Sie „Web” und geben Sie die URL an, unter der Ihre Anwendung erreichbar ist, z.B. `https://meineapp.com/signin-oidc`.
Wichtig: Für einen interaktiven Login-Prompt *muss* eine Umleitungs-URI konfiguriert werden, da der Browser nach der Authentifizierung dorthin zurückkehrt, um der Anwendung die Token zu übergeben.
- Klicken Sie auf „Registrieren”.
- API-Berechtigungen konfigurieren: Nach der Registrierung Ihrer Anwendung navigieren Sie zum Abschnitt „API-Berechtigungen”.
- Klicken Sie auf „Berechtigung hinzufügen”.
- Wählen Sie „Microsoft Graph” und/oder „SharePoint”. Es wird dringend empfohlen, wo immer möglich, die Microsoft Graph API zu verwenden, da sie eine einheitlichere und zukunftssicherere Schnittstelle für Microsoft 365-Dienste bietet.
- Wählen Sie die erforderlichen Berechtigungen aus. Für einen Dateiupload benötigen Sie delegierte Berechtigungen (im Namen des angemeldeten Benutzers).
- Für Microsoft Graph:
Files.ReadWrite
(für Dateien des angemeldeten Benutzers)Sites.ReadWrite.All
(für Dateien auf allen SharePoint-Websites, auf die der Benutzer Zugriff hat)offline_access
(ermöglicht die Aktualisierung von Token, damit Benutzer sich nicht ständig neu anmelden müssen)
- Für SharePoint (falls Graph nicht ausreicht oder Sie spezifische SharePoint-APIs verwenden):
Sites.ReadWrite.All
oder spezifischere Berechtigungen wieFiles.ReadWrite.All
unter „SharePoint”.
- Für Microsoft Graph:
- Klicken Sie auf „Berechtigungen hinzufügen” und anschließend „Administratorzustimmung für [Ihr Mandant] erteilen”. Dies erspart Benutzern die individuelle Zustimmung, wenn die Berechtigungen von einem Administrator vorab genehmigt werden.
Schritt 2: Die richtige Authentifizierungsstrategie wählen
Für den interaktiven Login-Prompt gibt es primär zwei relevante OAuth 2.0-Flows:
- Authorization Code Flow (Autorisierungscode-Fluss): Dies ist der Standard für Web- und Desktopanwendungen. Der Benutzer wird zu einer Anmeldeseite umgeleitet, meldet sich an, und der Browser leitet ihn mit einem Autorisierungscode zurück an die Anwendung. Die Anwendung tauscht diesen Code gegen ein Access Token und ein Refresh Token ein.
- Device Code Flow (Gerätecode-Fluss): Ideal für Anwendungen auf Geräten ohne vollständigen Browser (z.B. CLI-Tools, Smart-TVs). Die Anwendung zeigt dem Benutzer einen Code an, den dieser in einem separaten Browser auf einem anderen Gerät eingibt, um die Anmeldung abzuschließen.
Für die meisten Anwendungen, die einen Login-Prompt anzeigen, ist der Authorization Code Flow die bevorzugte Wahl. Die Microsoft Authentication Library (MSAL) vereinfacht die Implementierung erheblich.
Schritt 3: Implementierung der Authentifizierung in Ihrer Anwendung (Beispiel: C# mit MSAL.NET)
Die Microsoft Authentication Library (MSAL) ist für verschiedene Plattformen (C#, Java, JavaScript, Python etc.) verfügbar und abstrahiert die Komplexität der OAuth 2.0-Flüsse. Im Folgenden ein konzeptionelles Beispiel für eine C#-Desktopanwendung:
using Microsoft.Identity.Client;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Net.Http;
using System.IO;
public class SharePointUploader
{
// Ihre Anwendungs-ID (Client ID) aus der Azure AD Registrierung
private const string ClientId = "IHRE_CLIENT_ID_HIER";
// Die Basis-URL Ihres SharePoint-Mandanten (z.B. https://ihrmandant.sharepoint.com)
private const string SharePointTenantUrl = "https://IHREMANDANT.sharepoint.com";
// Die benötigten Scopes für Microsoft Graph oder SharePoint
// Für Graph API:
private string[] Scopes = new string[] { "User.Read", "Files.ReadWrite.All", "Sites.ReadWrite.All", "offline_access" };
// Für SharePoint REST API (direkt):
// private string[] Scopes = new string[] { $"{SharePointTenantUrl}/.default", "offline_access" }; // .default Scope für SharePoint
private IPublicClientApplication _app;
public SharePointUploader()
{
_app = PublicClientApplicationBuilder.Create(ClientId)
.WithRedirectUri("http://localhost") // Oder https://login.microsoftonline.com/common/oauth2/nativeclient
.WithTenantId("common") // Oder Ihre spezifische Mandanten-ID
.Build();
}
public async Task<AuthenticationResult> AuthenticateInteractiveAsync()
{
AuthenticationResult authResult = null;
try
{
// Versuchen, Token aus dem Cache zu erhalten (SSO)
var accounts = await _app.GetAccountsAsync();
if (accounts.Any())
{
authResult = await _app.AcquireTokenSilent(Scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
else
{
// Interaktive Anmeldung, falls kein Token im Cache
authResult = await _app.AcquireTokenInteractive(Scopes)
.WithPrompt(Prompt.SelectAccount) // Oder Prompt.ForceConsent, Prompt.Always, etc.
.ExecuteAsync();
}
}
catch (MsalUiRequiredException)
{
// Ein UI-Prompt ist erforderlich (z.B. Token abgelaufen, Benutzer hat sich abgemeldet)
authResult = await _app.AcquireTokenInteractive(Scopes)
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Fehler bei der Authentifizierung: {ex.Message}");
throw;
}
return authResult;
}
public async Task UploadFileToSharePointAsync(string filePath, string siteRelativeUrl, string folderRelativeUrl)
{
var authResult = await AuthenticateInteractiveAsync();
if (authResult == null)
{
Console.WriteLine("Authentifizierung fehlgeschlagen.");
return;
}
string accessToken = authResult.AccessToken;
// Beispiel für Microsoft Graph API (empfohlen)
// Ziel: https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root:/{folderPath}/{filename}:/content
// Zuerst Site ID und Drive ID holen
// Für eine bestimmte Site:
// GET https://graph.microsoft.com/v1.0/sites/{SharePointTenantUrl}:/sites/{siteRelativeUrl}
// Oder für die Root Site:
// GET https://graph.microsoft.com/v1.0/sites/root
// Wenn Sie die Site ID haben, dann:
// GET https://graph.microsoft.com/v1.0/sites/{site-id}/drive
// Vereinfachtes Beispiel, direkt zum Upload, wenn Sie die Site ID und Drive ID kennen
// Realistisch müssten Sie diese dynamisch abfragen oder vorkonfigurieren.
// Für dieses Beispiel gehen wir davon aus, dass wir eine Site ID und Drive ID haben oder den Pfad relativ zur Root-Site verwenden können.
// Hier ein Beispiel für den Upload über Graph API in die Standard-Dokumentenbibliothek der Root-Site
// oder einer bekannten Site (Sie müssen die Site ID und Drive ID ermitteln!)
// Wenn Sie direkt mit Pfaden arbeiten wollen, ist es oft einfacher:
// PUT /me/drive/root:/{path-to-file}/{filename}:/content
// Oder für eine spezifische Site:
// PUT /sites/{site-id}/drive/root:/{path-to-file}/{filename}:/content
// Nehmen wir an, wir laden in die Dokumente eines Benutzers hoch, oder Sie passen den Pfad an:
string fileName = Path.GetFileName(filePath);
// Beispiel: Hochladen in den Ordner 'Uploads' in der Standard-Dokumentenbibliothek der Root-Site
// Sie müssen die genaue URL und den Pfad anpassen!
// Um eine Site-ID zu bekommen: GET https://graph.microsoft.com/v1.0/sites/{SharePointTenantUrl}:/sites/{siteRelativeUrl}
// Dann aus dem Ergebnis die ID holen.
// Vereinfacht für dieses Beispiel: Direkt auf die Site-ID zugreifen, wenn bekannt.
// Für "Dokumente" der Root-Site:
// string uploadUrl = $"{SharePointTenantUrl}/_api/web/GetFolderByServerRelativeUrl('{folderRelativeUrl}')/Files/add(overwrite=true,url='{fileName}')";
// Beispiel mit Microsoft Graph für einen Upload in die Standard-Dokumentebibliothek der Root-Site
// (Annahme: wir kennen die Site-ID oder nutzen den 'root' Endpunkt)
// Oder besser: /sites/{hostname},{site-id},{web-id}/drive/root:{path-to-folder}/{filename}:/content
// Oder den Pfad zum Drive direkt angeben, z.B. https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root:/FolderA/FolderB/MyFile.txt:/content
// Für den Upload in ein spezifisches Verzeichnis in einer SharePoint-Site via Graph:
// GET https://graph.microsoft.com/v1.0/sites?search={siteName} -> um Site ID zu finden
// GET https://graph.microsoft.com/v1.0/sites/{siteId}/drives -> um Drive ID zu finden
// Hier ein vereinfachtes Graph-Upload-Beispiel für "My Documents" (OneDrive des angemeldeten Benutzers)
// Oder wenn Sie die Site-ID und Drive-ID statisch einstellen (nicht empfohlen für dynamische Szenarien):
// string siteId = "Ihre_SharePoint_Site_ID"; // z.B. 12345678-abcd-1234-abcd-1234567890ab
// string driveId = "Ihre_SharePoint_Drive_ID"; // z.B. 98765432-efgh-9876-efgh-9876543210fe
// string graphUploadUrl = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives/{driveId}/root:/{folderRelativeUrl}/{fileName}:/content";
// Ein generischerer Ansatz für die Standarddokumentenbibliothek einer Site, wenn Sie die URL kennen:
// GET https://graph.microsoft.com/v1.0/sites/{SharePointTenantUrl}:/sites/{siteRelativeUrl}
// Dann result.id für siteId und result.driveId für driveId holen.
// Für Einfachheit, verwenden wir einen OneDrive-Pfad oder den direkten SharePoint REST API Aufruf
// Beispiel mit SharePoint REST API (direkter Upload)
string uploadUrl = $"{SharePointTenantUrl}/sites/{siteRelativeUrl}/_api/web/GetFolderByServerRelativeUrl('{folderRelativeUrl}')/Files/add(overwrite=true,url='{fileName}')";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); // Für SharePoint REST API
byte[] fileBytes = File.ReadAllBytes(filePath);
var content = new ByteArrayContent(fileBytes);
content.Headers.Add("Content-Type", "application/octet-stream");
var response = await client.PostAsync(uploadUrl, content); // POST für SharePoint REST, PUT für Graph API
if (response.IsSuccessStatusCode)
{
Console.WriteLine($"Datei '{fileName}' erfolgreich nach SharePoint hochgeladen!");
}
else
{
string errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Fehler beim Hochladen der Datei: {response.StatusCode} - {errorContent}");
}
}
}
}
Erläuterung des Codes:
- Die
PublicClientApplicationBuilder
-Klasse wird verwendet, um eine öffentliche Clientanwendung zu konfigurieren (Desktop-Apps, Mobile-Apps). - Die
WithRedirectUri("http://localhost")
-Methode ist wichtig, damit MSAL einen lokalen Webserver startet, um den Autorisierungscode nach der Browser-Umleitung abzufangen. AcquireTokenSilent
versucht, ein Token aus dem Cache abzurufen, um unnötige Anmeldungen zu vermeiden.AcquireTokenInteractive
startet den interaktiven Login-Prompt, falls kein gültiges Token verfügbar ist oder der Benutzer sich neu anmelden muss.- Der erhaltene
accessToken
wird dann alsBearer
-Token imAuthorization
-Header bei HTTP-Anfragen an SharePoint (oder Graph) verwendet.
Schritt 4: Den Dateiupload durchführen
Nachdem Sie erfolgreich ein Access Token erhalten haben, können Sie damit HTTP-Anfragen an die Microsoft Graph API oder die SharePoint REST API stellen, um die Datei hochzuladen.
Option A: Microsoft Graph API (Empfohlen)
Die Graph API ist die moderne und bevorzugte Schnittstelle für Microsoft 365-Dienste. Sie bietet eine konsistente API für SharePoint, OneDrive, Teams, Exchange und mehr. Ein Dateiupload erfolgt typischerweise mit einer PUT-Anfrage an den spezifischen Endpunkt:
PUT https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root:/{pfad_zum_ordner}/{dateiname}.ext:/content
Content-Type: application/octet-stream
Authorization: Bearer {Access Token}
[Binärinhalt der Datei]
Um die site-id
und drive-id
zu erhalten, müssen Sie möglicherweise zuerst andere Graph-Aufrufe tätigen, z.B. GET https://graph.microsoft.com/v1.0/sites?search={sitename}
oder GET https://graph.microsoft.com/v1.0/sites/{hostname}:/sites/{sitepfad}:/
.
Option B: SharePoint REST API
Die SharePoint REST API ist auch eine Option, ist aber spezifischer für SharePoint und hat eine andere Struktur.
POST https://{IhreMandantenUrl}/sites/{SiteRelativeUrl}/_api/web/GetFolderByServerRelativeUrl('{OrdnerRelativerPfad}')/Files/add(overwrite=true,url='{Dateiname}')
Content-Type: application/octet-stream
Authorization: Bearer {Access Token}
[Binärinhalt der Datei]
Beide Methoden erfordern, dass die Datei als Binärdaten im HTTP-Request-Body gesendet wird.
Best Practices und Überlegungen
- Fehlerbehandlung: Implementieren Sie robuste Fehlerbehandlung, insbesondere für Netzwerkfehler, Authentifizierungsfehler und API-Antwortfehler.
- Token-Caching und Erneuerung: MSAL verwaltet automatisch den Token-Cache und die Erneuerung von Refresh Tokens. Nutzen Sie diese Funktionen, um die Anzahl der Anmelde-Prompts für den Benutzer zu minimieren.
- Minimalprinzip bei Berechtigungen: Erteilen Sie Ihrer Anwendung nur die absolut notwendigen Berechtigungen (z.B.
Files.ReadWrite.All
stattSites.FullControl.All
). - Umgang mit vertraulichen Daten: Auch wenn der Login-Prompt die direkte Passwortverwendung vermeidet, sollten Client-Geheimnisse (falls Sie einen vertraulichen Client erstellen) niemals in Client-Anwendungen offengelegt werden. Für öffentliche Clients (wie Desktop-Apps) ist dies nicht relevant, da sie keine Client-Geheimnisse verwenden.
- Benutzerfreundlichkeit des Login-Prompts: Stellen Sie sicher, dass der Benutzer versteht, warum er sich anmelden muss und welche Berechtigungen die Anwendung anfordert. Die von Microsoft bereitgestellte Anmeldeseite ist hierfür optimiert.
- SharePoint On-Premises: Beachten Sie, dass dieser Artikel sich auf SharePoint Online konzentriert. SharePoint On-Premises verwendet in der Regel andere Authentifizierungsmethoden wie NTLM, Kerberos oder ADFS, die nicht direkt mit Azure AD und einem interaktiven Login-Prompt in dieser Form funktionieren.
Zusammenfassung
Das Anmelden Ihrer Anwendung per Login-Prompt für den Dateiupload in SharePoint Online ist ein sicherer und benutzerfreundlicher Weg, um Automatisierung und Integration zu ermöglichen. Durch die Registrierung Ihrer Anwendung in Azure AD, die Auswahl des richtigen OAuth 2.0-Flows (in der Regel Authorization Code Flow) und die Nutzung einer Bibliothek wie MSAL können Sie den Authentifizierungsprozess effizient implementieren. In Kombination mit der leistungsstarken Microsoft Graph API oder der SharePoint REST API steht Ihnen der Weg offen, Ihre Dateiupload-Szenarien zu realisieren und Ihre Workflows nahtlos zu integrieren. Mit den hier vorgestellten Schritten halten Sie den Schlüssel zur SharePoint-Integration in den Händen.