Authentifizierung in Reporting Services
Unter Authentifizierung versteht man den Prozess, Benutzerrechte für eine bestimmte Identität einzurichten. Es gibt viele Techniken, die Sie verwenden können, um einen Benutzer zu authentifizieren. Die gängigste Methode ist die Verwendung von Kennwörtern. Wenn Sie beispielsweise die Formularauthentifizierung implementieren, benötigen Sie eine Implementierung, bei der die Benutzer nach den Anmeldeinformationen durchsucht werden (normalerweise über eine Oberfläche, in der Anmeldename und Kennwort angefordert werden) und bei der die Benutzer mit einem Datenspeicher, z. B. einer Datenbanktabelle oder einer Konfigurationsdatei, abgeglichen werden. Wenn die Anmeldeinformationen nicht validiert werden können, schlägt der Authentifizierungsprozess fehl, und der Benutzer nimmt eine anonyme Identität an.
Benutzerdefinierte Authentifizierung in den Reporting Services
In Reporting Services übernimmt das Windows-Betriebssystem die Authentifizierung von Benutzern, entweder über die integrierte Sicherheit oder über den expliziten Empfang und die Überprüfung von Benutzeranmeldeinformationen. Die benutzerdefinierte Authentifizierung kann in Reporting Services so entwickelt werden, dass zusätzliche Authentifizierungsverfahren unterstützt werden. Dies wird durch die Sicherheitserweiterungsschnittstelle IAuthenticationExtension ermöglicht. Alle Erweiterungen erben für jede vom Berichtsserver bereitgestellte und verwendete Erweiterung von der IExtension-Basisschnittstelle. IExtension und IAuthenticationExtension sind Elemente des Microsoft.ReportingServices.Interfaces-Namespace.
Die primäre Methode für die Authentifizierung bei einem Berichtsserver in Reporting Services ist die LogonUser-Methode. Dieses Element des Reporting Services-Webdiensts kann verwendet werden, um die Benutzeranmeldeinformationen zur Validierung an einen Berichtsserver zu übergeben. Ihre zugrunde liegende Sicherheitserweiterung implementiert IAuthenticationExtension.LogonUser , die Ihren benutzerdefinierten Authentifizierungscode enthält. Im Beispiel zur Formularauthentifizierung wird mit LogonUser eine Authentifizierungsprüfung der angegebenen Anmeldeinformationen und eines benutzerdefinierten Benutzerspeichers in einer Datenbank durchgeführt. Ein Beispiel für die Implementierung von LogonUser sieht folgendermaßen aus:
public bool LogonUser(string userName, string password, string authority)
{
return AuthenticationUtilities.VerifyPassword(userName, password);
}
Die folgende Beispielfunktion wird verwendet, um die angegebenen Anmeldeinformationen zu überprüfen:
internal static bool VerifyPassword(string suppliedUserName,
string suppliedPassword)
{
bool passwordMatch = false;
// Get the salt and pwd from the database based on the user name.
// See "How To: Use DPAPI (Machine Store) from ASP.NET," "How To:
// Use DPAPI (User Store) from Enterprise Services," and "How To:
// Create a DPAPI Library" for more information about how to use
// DPAPI to securely store connection strings.
SqlConnection conn = new SqlConnection(
"Server=localhost;" +
"Integrated Security=SSPI;" +
"database=UserAccounts");
SqlCommand cmd = new SqlCommand("LookupUser", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter sqlParam = cmd.Parameters.Add("@userName",
SqlDbType.VarChar,
255);
sqlParam.Value = suppliedUserName;
try
{
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
reader.Read(); // Advance to the one and only row
// Return output parameters from returned data stream
string dbPasswordHash = reader.GetString(0);
string salt = reader.GetString(1);
reader.Close();
// Now take the salt and the password entered by the user
// and concatenate them together.
string passwordAndSalt = String.Concat(suppliedPassword, salt);
// Now hash them
string hashedPasswordAndSalt =
FormsAuthentication.HashPasswordForStoringInConfigFile(
passwordAndSalt,
"SHA1");
// Now verify them. Returns true if they are equal.
passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);
}
catch (Exception ex)
{
throw new Exception("Exception verifying password. " +
ex.Message);
}
finally
{
conn.Close();
}
return passwordMatch;
}
Authentifizierungsablauf
Der Reporting Services-Webdienst verfügt über benutzerdefinierte Authentifizierungserweiterungen, um eine Formularauthentifizierung durch den Berichts-Manager und den Berichtsserver zu ermöglichen.
Mit der LogonUser-Methode des Reporting Services Webdiensts werden dem Berichtsserver die Anmeldeinformationen zur Authentifizierung vorgelegt. Der Webdienst verwendet HTTP-Header, um für validierte Anmeldeanforderungen ein Authentifizierungsticket („Cookie“) vom Server an den Client zu übergeben.
In folgender Abbildung sehen Sie die Methode, wie Benutzer im Webdienst authentifiziert werden, wenn Ihre Anwendung mit einem Berichtsserver eingesetzt wird, der für die Verwendung einer benutzerdefinierten Authentifizierungserweiterung konfiguriert ist.
Wie in Abbildung 2 gezeigt, sieht der Authentifizierungsprozess folgendermaßen aus:
Eine Clientanwendung ruft die Webdienstmethode LogonUser auf, um einen Benutzer zu authentifizieren.
Der Webdienst ruft die LogonUser -Methode Ihrer Sicherheitserweiterung auf, insbesondere die Klasse, die IAuthenticationExtension implementiert.
Die Implementierung von LogonUser überprüft den Benutzernamen und das Kennwort im Benutzerspeicher oder in der Sicherheitsinstanz.
Nach der erfolgreichen Authentifizierung erstellt der Webdienst ein Cookie und verwaltet es für die Sitzung.
Der Webdienst gibt das Authentifizierungsticket an die aufrufende Anwendung im HTTP-Header zurück.
Hat der Webdienst einen Benutzer erfolgreich über die Sicherheitserweiterung authentifiziert, generiert er ein Cookie, das für nachfolgende Anforderungen verwendet wird. Das Cookie wird möglicherweise nicht persistent mit der benutzerdefinierten Sicherheitsinstanz gespeichert, da der Berichtsserver über keine eigene Sicherheitsinstanz verfügt. Das Cookie wird von der Webdienstmethode LogonUser zurückgegeben und wird in Folgeaufrufen der Webdienstmethode und beim URL-Zugriff verwendet.
Hinweis
Um zu verhindern, dass das Cookie während der Übertragung beschädigt wird, sollten Authentifizierungscookies, die von LogonUser zurückgegeben werden, über SSL-Verschlüsselung (Secure Sockets Layer) verschlüsselt werden.
Wenn Sie per URL auf den Berichtserver zugreifen und eine benutzerdefinierte Sicherheitserweiterung installiert ist, verwalten Internet Information Services (IIS) und ASP.NET automatisch die Übertragung des Authentifizierungstickets. Wenn Sie über die SOAP-API auf den Berichtsserver zugreifen, muss Ihre Implementierung der Proxyklasse zusätzliche Unterstützung für die Verwaltung des Authentifizierungstickets enthalten. Weitere Informationen zur Verwendung der SOAP-API und zur Verwendung des Authentifizierungstickets finden Sie unter „Verwenden des Webdiensts mit benutzerdefinierter Sicherheit“.
Formularauthentifizierung
Die Formularauthentifizierung ist eine Art der ASP.NET-Authentifizierung, bei der ein nicht authentifizierter Benutzer an ein HTML-Formular weitergeleitet wird. Sobald der Benutzer seine Anmeldeinformationen angibt, gibt das System ein Cookie aus, das ein Authentifizierungsticket enthält. Bei späteren Anforderungen prüft das System zuerst das Cookie, um festzustellen, ob der Benutzer bereits durch den Berichtsserver authentifiziert wurde.
Reporting Services kann so erweitert werden, dass die Formularauthentifizierung unterstützt wird. Hierzu werden Sicherheitserweiterungsschnittstellen verwendet, die über die Reporting Services-API zur Verfügung gestellt werden. Wenn Sie Reporting Services zur Verwendung der Formularauthentifizierung erweitern, verwenden Sie Secure Sockets Layer (SSL) für die gesamte Kommunikation mit dem Berichtsserver, um zu verhindern, dass böswillige Benutzer Zugriff auf das Cookie eines anderen Benutzers erhalten. SSL ermöglicht Clients und dem Berichtsserver eine gegenseitige Authentifizierung, um sicherzustellen, dass keine anderen Computer den Inhalt der Kommunikation zwischen zwei Computern lesen können. Alle Daten, die über SSL-Verbindung von einem Client versendet werden, sind verschlüsselt, sodass unberechtigte Benutzer an den Berichtsserver gesandte Kennwörter und Daten nicht abfangen können.
Die Formularauthentifizierung wird normalerweise implementiert, um Konten und die Authentifizierung für Nicht-Windows-Plattformen zu unterstützen. Einem Benutzer, der auf einen Berichtsserver zugreifen möchte, wird eine grafische Oberfläche angezeigt, und die angegebenen Anmeldeinformationen werden zur Authentifizierung an eine Sicherheitsinstanz übergeben.
Bei der Formularauthentifizierung muss eine Person anwesend sein, um die Anmeldeinformationen einzugeben. Bei unbeaufsichtigten Anwendungen, die direkt mit dem Reporting Services-Webdienst kommunizieren, muss die Formularauthentifizierung mit einem benutzerdefinierten Authentifizierungsschema kombiniert werden.
Die Formularauthentifizierung ist für Reporting Services in den folgenden Fällen sinnvoll:
Sie müssen Benutzer speichern und authentifizieren, die keine Microsoft Windows-Konten besitzen, und
Sie müssen Ihr eigenes Benutzeroberflächenformular als Anmeldeseite zwischen den verschiedenen Seiten auf einer Website angeben.
Beachten Sie Folgendes, wenn Sie eine benutzerdefinierte Sicherheitserweiterung schreiben, die die Formularauthentifizierung unterstützt:
Wenn Sie die Formularauthentifizierung verwenden, muss der anonyme Zugriff auf dem virtuellen Verzeichnis des Berichtsservers in IIS (Internet Information Services) aktiviert sein.
Die ASP.NET-Authentifizierung muss auf „Forms“ festgelegt sein. Sie konfigurieren die ASP.NET-Authentifizierung in der Datei „Web.config“ für den Berichtsserver.
Reporting Services kann Benutzer entweder mithilfe der Windows-Authentifizierung oder anhand der benutzerdefinierten Authentifizierung authentifizieren und autorisieren, aber nicht beides. Reporting Services bietet keine Unterstützung für die gleichzeitige Verwendung von mehreren Sicherheitserweiterungen.