Ich implementiere einen sicheren WCF-Dienst. Die Authentifizierung erfolgt mit Benutzernamen/Passwort oder Windows-Anmeldedaten. Der Dienst wird in einem Windows-Dienstprozess gehostet. Jetzt versuche ich herauszufinden, die beste Möglichkeit, Autorisierung für jeden Service-Betrieb zu implementieren.WCF Service-Autorisierungsmuster
Betrachten wir zum Beispiel die folgende Methode:
public EntityInfo GetEntityInfo(string entityId);
Wie Sie vielleicht wissen, in WCF, gibt es eine Operation Objekt, von dem Sie die Anmeldeinformationen abrufen können vom Anrufer/Client übergeben. Jetzt wäre die Authentifizierung bereits beendet, wenn die erste Zeile in der Methode aufgerufen wird. Wie implementieren wir jedoch die Autorisierung, wenn die Entscheidung von den Eingabedaten selbst abhängt? Im obigen Fall sagen Benutzer "admin" (deren Berechtigungen usw. in einer Datenbank gespeichert sind), Entitätsinformationen zu erhalten, und andere Benutzer sollten nicht erlaubt sein ... Wo setzen wir die Berechtigungsprüfungen?
Sagen wir es in der ersten Zeile des Verfahrens wie so setzen:
CheckAccessPermission(PermissionType.GetEntity, user, entityId) //user is pulled from the current OperationContext
Nun gibt es ein paar Fragen:
wir Sie die EntityID (zB Check validieren Null-/Leerwert usw.) VOR der Berechtigungsprüfung oder INSIDE der Berechtigungsprüfung? Mit anderen Worten, wenn Berechtigungsprüfungen in jeder Methode enthalten sein sollten, ist das ein gutes Muster? Was sollte zuerst geschehen - Argumentvalidierung oder Autorisierung?
Wie testen wir einen WCF-Dienst, wenn die Berechtigungsprüfungen überall so sind und wir keinen OperationContext im Komponententest haben? (Angenommen, ich versuche, diese Dienstklassenimplementierung direkt ohne das WCF-Setup zu testen).
Irgendwelche Ideen Leute?
Danke Paul. Das Problem mit der ersten Autorisierung ist: Wie autorisieren wir einen Benutzer, wenn wir die Berechtigungen basierend auf den Eingabeargumenten überprüfen müssen? Müssen wir diese Argumente nicht zuerst validieren, bevor wir sie zur Autorisierung verwenden? – Krishna
Die Autorisierung sollte nur von der Identität des Benutzers abhängen. Wenn es von Eingabeargumenten abhängt, kann der Aufrufer die Werte senden, die er benötigt, um die gewünschte Autorisierung zu erhalten, sodass Ihre Berechtigungsprüfung bedeutungslos wird. –
Nein. Ich möchte auf ein Objekt mit der ID 'abc1' zugreifen. Ich bin 'Benutzer1'. Die Autorisierung entscheidet, ob 'Benutzer 1' auf das Objekt 'abc1' zugreifen kann. Das erste, was zu tun ist, ist, den Parameter zu validieren, der den Objekt-ID-String enthält! – Krishna