2013-10-07 21 views
6

W celu zarejestrowania korzystania z rozwijanej przez mnie aplikacji, potrzebuję każdego użytkownika korzystającego z mojej aplikacji do wykonywania zapytań dotyczących mojej bazy danych SQL Server pod ich własnymi danymi uwierzytelniającymi.Jak przyznać uprawnienia do IMPERSONACJI każdemu innemu użytkownikowi?

Abynie przechowywać haseł w sposób możliwy do odzyskania, nie mogę utworzyć połączenia dla każdego użytkownika (ponieważ oznaczałoby to znajomość hasła po krótkim oknie po zalogowaniu się).

Pozornie oczywiste rozwiązanie tego problemu (które może być nieoptymalne) polega na uruchamianiu wszystkich wrażliwych zapytań jako ogólny użytkownik aplikacji, podszywając się pod zalogowanego użytkownika (wymagając tylko skojarzenia zalogowanego użytkownika z nazwą użytkownika ... co nie jest złe).

Moim problemem jest to, że nie jestem pewien, w jaki sposób przyznać się do podszycia się wszystkim użytkownikom określonej roli lub wszystkim użytkownikom w ogóle (nie najjaśniejszy pomysł, ponieważ nie chcę, aby aplikacja podszywała się pod sysadmin, na przykład).

grant impersonate on all to ApplicationLogin 

nie działa, i nie ma dokumentacji, że mogę stwierdzić, że sugeruje udzielanie personifikacji na członków roli byłoby wykonalne ...

Jakieś pomysły?

+0

Czy określona rola oznacza rolę bazy danych? –

+0

na pewno, o ile może być naprawdę szeroki. – Crisfole

+1

Dodano pewne szczegóły^ – Crisfole

Odpowiedz

0

Można użyć dynamicznego sql. poniższy kod pobiera wszystkich użytkowników związanych z określoną rolą, a następnie udziela im pozwolenia na podszywanie się pod użytkownika. Powinieneś utworzyć użytkownika na logowaniu aplikacji, aby powiązać go z bazą danych, a następnie nadać uprawnienia do podszywania się pod wszystkich członków określonej roli. Jest to kod:

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) 

Mam nadzieję, że to praca dla Ciebie.

+0

Och, miałem na myśli taki, który nie wymagał ponownego uruchomienia zapytania za każdym razem, gdy użytkownik był dodawany, usuwany lub zmieniany ... – Crisfole

+0

nie ma mechanizmu, który dbms mógłby dowiedzieć się i zrobić coś na temat dodawania użytkowników. ale jeśli często dodajesz użytkowników, możesz dodać ten kod do agenta serwera sql, aby zrobić to często lub prawie co godzinę. to zapytanie nie jest ciężkie do wykonania. –

+0

Znalazłem. Powinieneś utworzyć wyzwalacz w celu użycia, aby to zrobić. Zaktualizuję mój post. –

0

Można tworzyć użytkowników za pomocą procedury przechowywanej. Ostatnim wierszem przechowywanej procedury byłoby nadanie podszywania się.

Aby skonfigurować bieżących użytkowników, należy je wszystkie przetestować i ustawić personifikację dotacji w tym samym czasie.

Powiązane problemy