SharePoint 2010 bietet mit dem SecureStoreService eine sichere Möglichkeit Benutzerinformationen abzulegen. Aber wie werden diese in eigenen Anwendungen integriert?
Im SecureStoreService können unter einem beliebigen Namen (dem Target Application ID) Benutzernamen und Passwörter abgelegt werden. Zusätzlich wird konfiguriert welche SharePoint Benutzer diese Credentials auslesen dürfen. Hier können einzelne Benutzer oder Benutzergruppen angegeben werden.
Auslesen der Credentials mit Server API
um den Secure Store Service im Code ansprechen zu können sind Verweise auf die microsoft.office.secureStoreService.dll sowie Microsoft.BusinessData.dll zu setzen. Beide Dlls liegen im ISAPI Verzeichnis des SharePoint Servers.
zunächst einmal der Code mit der Hauptfunktion. Die Übergabe der Target Application ID erfolgt im Parameter appId und die Rückgabe der Credentials als zwei out string Parameter.
1: public static void GetCredentials(string appId, out string user, out string PWD)
2: {
3: user = "";
4: PWD = "";
5:
6: ISecureStoreProvider provider = SecureStoreProviderFactory.Create();
7:
8: ISecureStoreServiceContext providerContext = provider as ISecureStoreServiceContext;
9: providerContext.Context = SPServiceContext.GetContext(GetCentralAdminSite());
10:
11: using (SecureStoreCredentialCollection creds = provider.GetCredentials(appId))
12: {
13: if (creds != null)
14: {
15: foreach (SecureStoreCredential cred in creds)
16: {
17: switch (cred.CredentialType)
18: {
19: case SecureStoreCredentialType.UserName:
20: user = GetStringFromSecureString(cred.Credential);
21: break;
22: case SecureStoreCredentialType.Password:
23: PWD = GetStringFromSecureString(cred.Credential);
24: break;
25: }
26: }
27: }
28: }
29: }
30: }
Die Credentials werden in einer Auflistung zurückgegeben. Anhand des Typs werden Benutzername und Password ausgelesen. Die gelieferten Typen hängen von der Konfiguration der Target Application im Secure Store Service ab. Möglich sind hier: Benutzername, Passwort, Pin, Windows-User, Windows-Passwort und generic. Die Daten werden als SecureString zurückgegeben. Mit der Funktion GetStringFromSecureString wird daraus ein normaler String.
1: private static string GetStringFromSecureString(SecureString secStr)
2: {
3: if (secStr == null)
4: {
5: return null;
6: }
7:
8: IntPtr pPlainText = IntPtr.Zero;
9: try
10: {
11: pPlainText = Marshal.SecureStringToBSTR(secStr);
12: return Marshal.PtrToStringBSTR(pPlainText);
13: }
14: finally
15: {
16: if (pPlainText != IntPtr.Zero)
17: {
18: Marshal.FreeBSTR(pPlainText);
19: }
20: }
21: }
Die so zurückgelieferten Information werden dann in weiterer Folge verwendet. Mein Szenario sieht den Zugriff auf einen SQL Server vor, also erstelle ich danach einen SQL Connection String.
Mein nächster Gedankengang, war es ein Webpart zu schreiben, das die Usernamen und Passwörter der hinterlegten Credentials ausliest und anzeigt!
Meine Vorstellung vom Secure Store Service war eine andere. Ich bin davon ausgegangen, dass die Informationen nicht mehr auslesbar sind. Beim Hinterlegen der Credentials wird ja auch folgende Meldung gezeigt:
Es stimmt schon. Der Administrator kann die Credentials nicht mehr auslesen. Aber mit dem Server API ist es möglich!