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 z. B. die Formularauthentifizierung implementieren, möchten Sie eine Implementierung, die Benutzer nach Anmeldeinformationen fragt (in der Regel durch eine Schnittstelle, die einen Anmeldenamen und ein Kennwort anfordert) und dann Benutzer anhand eines Datenspeichers überprüft, z. B. eine Datenbanktabelle oder Konfigurationsdatei. Wenn die Anmeldeinformationen nicht überprüft werden können, schlägt der Authentifizierungsprozess fehl, und der Benutzer geht von einer anonymen Identität aus.
Benutzerdefinierte Authentifizierung in 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. Benutzerdefinierte Authentifizierung kann in Reporting Services entwickelt werden, um weitere Authentifizierungsschemas zu unterstützen. Diese Unterstützung wird über die Sicherheitserweiterungsschnittstelle IAuthenticationExtension2ermöglicht. Alle Erweiterungen erben für jede vom Berichtsserver bereitgestellte und verwendete Erweiterung von der IExtension-Basisschnittstelle. IExtension, und IAuthenticationExtension2, sind Member 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. Die zugrunde liegende Sicherheitserweiterung implementiert IAuthenticationExtension2.LogonUser, das den 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 das Webportal 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 ein Authentifizierungsticket (als "Cookie" bezeichnet) vom Server an den Client zu übergeben, um überprüfte Anmeldeanforderungen zu erhalten.
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 Methode LogonUser Ihrer Sicherheitserweiterung auf, genauer gesagt die Klasse, von der IAuthenticationExtension2 implementiert wird.
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 bleibt möglicherweise nicht innerhalb der benutzerdefinierten Sicherheitsbehörde erhalten, da der Berichtsserver nicht der Besitzer der Sicherheitsautorität ist. 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, müssen Authentifizierungscookies, die von LogonUser zurückgegeben werden, per TLS-Verschlüsselung (Transport Layer Security, früher als Secure Sockets Layer, SSL, bezeichnet) 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 überprüft das System zunächst das Cookie, um festzustellen, ob der Berichtsserver den Benutzer authentifiziert hat.
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 für die gesamte Kommunikation mit dem Berichtsserver Transport Layer Security (TLS, früher als Secure Sockets Layer, SSL, bezeichnet), damit sich unberechtigte Benutzer keinen Zugriff auf Cookies anderer Benutzer verschaffen können. TLS ermöglicht Clients und dem Berichtsserver eine gegenseitige Authentifizierung, um sicherzustellen, dass keine anderen Computer den Inhalt der Kommunikation zwischen den beiden Computern lesen können. Alle Daten, die über eine TLS-Verbindung von einem Client gesendet werden, werden verschlüsselt, sodass böswillige Benutzer keine Kennwörter oder Daten abfangen können, die an einen Berichtsserver gesendet werden.
Die Formularauthentifizierung wird implementiert, um Konten und Authentifizierung für andere Plattformen als Windows 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 nicht über Microsoft Windows-Konten verfügen, und
Sie müssen Ihr eigenes Benutzeroberflächenformular als Anmeldeseite zwischen verschiedenen Seiten auf einer Website bereitstellen.
Beachten Sie die folgenden Punkte beim Schreiben einer benutzerdefinierten Sicherheitserweiterung, 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 unterstützt nicht die gleichzeitige Verwendung mehrerer Sicherheitserweiterungen.