2013-10-07 14 views
6

Um die Verwendung einer Anwendung, die ich entwickle, zu protokollieren, brauche ich jeden Benutzer, der meine Anwendung verwendet, um Abfragen für meine SQL Server-Datenbank mit ihren eigenen Anmeldeinformationen auszuführen.Wie erteile ich die Erlaubnis, einen anderen Benutzer zu IMPERSONIEREN?

Um nicht ihre Passwörter in einer abrufbaren Weise zu speichern, kann ich keine Verbindung auf einer Benutzerbasis erstellen (weil das dazu führen würde, ihr Passwort hinter dem kurzen Fenster zu kennen, wenn sie sich einloggen). Die offensichtlich scheinende Lösung für dieses Problem (die möglicherweise nicht optimal ist) besteht darin, alle vertraulichen Abfragen als generischer Benutzer "Anwendung" auszuführen, der sich als angemeldeter Benutzer ausgibt (ich muss nur den angemeldeten Benutzer zuordnen) mit einem Benutzernamen ... was keine schlechte Sache ist).

Mein Problem ist, dass ich nicht sicher bin, wie man allen Benutzern einer bestimmten Rolle oder allen Benutzern im Allgemeinen die Identität zuerkennt (nicht die hellste Idee, weil ich nicht möchte, dass sich die App zum Beispiel als Systemadministrator ausgibt)).

grant impersonate on all to ApplicationLogin 

nicht funktioniert, und es gibt keine Dokumentation, die ich finden kann, dass schlägt vor, auf die Mitglieder einer Rolle Identitätswechsel gewähren würde machbar sein ...

Irgendwelche Ideen?

+0

Bedeutet eine bestimmte Rolle Datenbankrolle? –

+0

sicher, solange es ein wirklich breiter sein kann. – Crisfole

+1

Hinzugefügt einige Details^ – Crisfole

Antwort

0

Sie können Dynamische SQL verwenden. Der folgende Code ruft alle Benutzer ab, die sich auf eine bestimmte Rolle beziehen, und erteilt dann einem Benutzer die Berechtigung impersonate. Sie sollten einen Benutzer bei der Anmeldung der Anwendung erstellen, um ihn mit der Datenbank zu verknüpfen, und dann die Berechtigung erteilen, die Identität aller Mitglieder einer bestimmten Rolle anzunehmen. Dies ist der Code:

CREATE TRIGGER S2 
ON DATABASE 
FOR CREATE_USER 
AS 

CREATE TABLE #T 
(PRINCIPAL_NAME NVARCHAR(100),ROLE_NAME NVARCHAR(100)); 
WITH L AS (SELECT * 
      FROM (SELECT P.name AS 'PRINCIPAL_NAME',R.role_principal_id AS 'GH' 
       FROM SYS.database_principals P,sys.database_role_members R 
       WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
       AND type<>'R') S INNER JOIN (SELECT P.name AS 'ROLE_NAME',P.principal_id AS 'GHA' 
               FROM SYS.database_principals P,sys.database_role_members R 
               WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
               AND type='R') D 
       ON D.GHA=S.GH) 
INSERT INTO #T 
SELECT DISTINCT PRINCIPAL_NAME,ROLE_NAME 
FROM L 
------------ ENTER ROLE NAME HERE 
WHERE ROLE_NAME LIKE '%%' 
------------ 
DECLARE @P NVARCHAR(100),@TEXT NVARCHAR(MAX)='' 
------------------------- CHANGE IT TO YOUR DESIRED NAME OF YOUR APPLICATION USER 
DECLARE @APPUSER NVARCHAR(100)='APPLICATION_USER' 
------------------------- 
DECLARE C CURSOR FOR SELECT PRINCIPAL_NAME FROM #T 
OPEN C 
FETCH NEXT FROM C INTO @P 
WHILE(@@FETCH_STATUS=0) 
    BEGIN 
     SET @TEXT+='GRANT IMPERSONATE ON USER::['[email protected]+'] TO '[email protected]+' ' 
     FETCH NEXT FROM C INTO @P 
    END 
CLOSE C 
DEALLOCATE C 
DROP TABLE #T 
EXEC(@TEXT) 

ich es für Sie arbeiten hoffen.

+0

Oh, ich meinte eine, die nicht erforderlich, die Abfrage jedes Mal erneut ausgeführt, wenn ein Benutzer hinzugefügt oder entfernt oder geändert wurde ... – Crisfole

+0

gibt es keinen Mechanismus, den die dbms herausfinden und etw Benutzer. Wenn Sie jedoch Benutzer häufig hinzufügen, können Sie diesen Code dem SQL Server-Agenten hinzufügen, um ihn häufig oder fast stündlich auszuführen. Diese Abfrage ist nicht schwer auszuführen. –

+0

Ich fand es Sie sollten einen Trigger bei create verwenden, um dies zu tun. Ich werde meinen Beitrag aktualisieren. –

0

Sie können Ihre Benutzer über eine gespeicherte Prozedur erstellen. Die letzte Zeile Ihrer gespeicherten Prozedur würde den Identitätswechsel gewähren.

Um die aktuellen Benutzer einzurichten, müssten Sie alle durchgehen und einmal den Grant-Identitätswechsel festlegen.

Verwandte Themen