Czy istnieje prosty, nieszablonowy sposób podszywania się pod użytkownika w .NET?
Do tej pory używałem tej klasy z projektu kodu do wszystkich moich wymagań dotyczących personifikacji.
Czy jest lepszy sposób na zrobienie tego przy użyciu .NET Framework?
Mam zestaw poświadczeń użytkownika (nazwa użytkownika, hasło, nazwa domeny), który reprezentuje tożsamość, której muszę się podszyć.
c#
.net
impersonation
ashwnacharya
źródło
źródło
Odpowiedzi:
Oto dobre omówienie koncepcji personifikacji platformy .NET.
Zasadniczo będziesz korzystać z tych klas, które są gotowe do użycia w środowisku .NET:
Kod często jest jednak długi i dlatego widzisz wiele przykładów, takich jak ten, do którego się odwołujesz, które próbują uprościć proces.
źródło
„Personifikacja” w przestrzeni .NET zwykle oznacza uruchamianie kodu na określonym koncie użytkownika. Jest to nieco inna koncepcja niż uzyskanie dostępu do tego konta użytkownika za pomocą nazwy użytkownika i hasła, chociaż te dwa pomysły często się łączą. Opiszę je oba, a następnie wyjaśnię, jak używać mojej biblioteki SimpleImpersonation , która używa ich wewnętrznie.
Personifikacja
Interfejsy API do personifikacji są udostępniane w .NET za pośrednictwem
System.Security.Principal
przestrzeni nazw:Nowszy kod (.NET 4.6+, .NET Core itd.) Powinny zazwyczaj używają
WindowsIdentity.RunImpersonated
, który akceptuje uchwyt do tokenu konta użytkownika, a następnie OSOBĄAction
lubFunc<T>
kodu do wykonania.lub
Starszy kod używał tej
WindowsIdentity.Impersonate
metody do pobieraniaWindowsImpersonationContext
obiektu. Ten obiekt implementujeIDisposable
, więc generalnie powinien być wywoływany zusing
bloku.Chociaż ten interfejs API nadal istnieje w .NET Framework, należy go zasadniczo unikać i nie jest dostępny w .NET Core ani .NET Standard.
Dostęp do konta użytkownika
Interfejs API do używania nazwy użytkownika i hasła w celu uzyskania dostępu do konta użytkownika w systemie Windows to
LogonUser
- natywny interfejs API Win32. Obecnie nie ma wbudowanego interfejsu .NET API do jego wywoływania, więc należy uciec się do P / Invoke.To jest podstawowa definicja połączenia, jednak należy wziąć pod uwagę znacznie więcej, aby faktycznie użyć jej w produkcji:
SecureString
kiedy można bezpiecznie odebrać jeden za pomocą naciśnięć klawiszy użytkownika.Ilość kodu do napisania, aby zilustrować to wszystko, przekracza to, co powinno być w odpowiedzi StackOverflow, IMHO.
Połączone i łatwiejsze podejście
Zamiast pisać to wszystko samodzielnie, rozważ użycie mojej biblioteki SimpleImpersonation , która łączy personifikację i dostęp użytkownika w jednym interfejsie API. Działa dobrze zarówno w nowoczesnych, jak i starszych bazach kodu, z tym samym prostym interfejsem API:
lub
Zauważ, że jest bardzo podobny do
WindowsIdentity.RunImpersonated
API, ale nie wymaga nic o uchwytach tokenu.To jest interfejs API w wersji 3.0.0. Więcej informacji można znaleźć w pliku Readme projektu. Należy również zauważyć, że poprzednia wersja biblioteki korzystała z interfejsu API ze
IDisposable
wzorcem, podobnym doWindowsIdentity.Impersonate
. Nowsza wersja jest znacznie bezpieczniejsza i obie są nadal używane wewnętrznie.źródło
Undo
że został wywołany podczas usuwania.Prawdopodobnie tego chcesz:
Ale naprawdę potrzebuję więcej szczegółów, aby ci pomóc. Możesz dokonać personifikacji za pomocą pliku konfiguracyjnego (jeśli próbujesz to zrobić w witrynie internetowej) lub za pomocą dekoratorów metod (atrybutów), jeśli jest to usługa WCF, lub przez ... masz pomysł.
Ponadto, jeśli mówimy o podszywaniu się pod klienta, który wywołał określoną usługę (lub aplikację internetową), musisz poprawnie skonfigurować klienta, aby przekazywał odpowiednie tokeny.
Wreszcie, jeśli naprawdę chcesz zrobić delegowanie, musisz również poprawnie skonfigurować AD, aby użytkownicy i komputery byli zaufani w kwestii delegowania.
Edycja:
zajrzyj tutaj, aby zobaczyć, jak podszyć się pod innego użytkownika, i uzyskać dalszą dokumentację.
źródło
Oto mój port vb.net z odpowiedzią Matta Johnsona. Dodałem wyliczenie dla typów logowania.
LOGON32_LOGON_INTERACTIVE
była pierwszą wartością wyliczenia, która działała dla serwera sql. Moje parametry połączenia były właśnie zaufane. Brak nazwy użytkownika / hasła w ciągu połączenia.Musisz użyć z
Using
instrukcją, aby zawierała kod do uruchomienia podszywającego się.źródło
Wyświetl więcej szczegółów z mojej poprzedniej odpowiedzi Utworzono pakiet NuGet Nuget
Kod na Githubie
próbka: możesz użyć:
Zobacz pełny kod:
źródło
Zdaję sobie sprawę, że jestem dość spóźniony na imprezę, ale uważam, że biblioteka Phillipa Allana-Hardinga jest najlepsza do tej sprawy i podobnych.
Potrzebujesz tylko małego fragmentu kodu, takiego jak ten:
I dodaj jego klasę:
.NET (C #) Personifikacja z poświadczeniami sieciowymi
Mój przykład może być użyty, jeśli chcesz, aby personifikowane logowanie miało poświadczenia sieciowe, ale ma więcej opcji.
źródło
Możesz skorzystać z tego rozwiązania. (Użyj pakietu nuget) Kod źródłowy jest dostępny na: Github: https://github.com/michelcedric/UserImpersonation
Więcej szczegółów https://michelcedric.wordpress.com/2015/09/03/usurpation-didentite-dun-user-c-user-impersonation/
źródło