2010-02-23 11 views
28

Piszę kod, aby wykorzystać składnik innej firmy, i muszę dostarczyć obiekt, który implementuje ICredentials, kiedy zacznę go używać.Jak uzyskać poświadczenia (NetworkCredential) aktualnie zalogowanego użytkownika?

Jeśli piszę Po ...

var credential = new NetworkCredential("MyUsername", "MyPassword"); 

... i przekazać "poświadczenia", to jest w porządku. Ale chciałbym przekazać referencje bieżącego użytkownika (jest to usługa Windows, więc działa jako określony użytkownik).

Próbowałem oba z następujących, ale nie wydaje się, aby pracować (lub czegokolwiek powrót):

NetworkCredential credential = System.Net.CredentialCache.DefaultCredentials; 
NetworkCredential credential = CredentialCache.DefaultNetworkCredentials; 

Może ktoś sugerują, jak nabyć approriate obiekt, który reprezentuje poświadczeń użytkownika, który usługa jest uruchomiona?

Dzięki, Ross

+0

See http://stackoverflow.com/questions/3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind może trzeba

+0

mam ten sam problem ze scenariuszem klienta WCF, zobacz ten wątek http://stackoverflow.com/questions/ 3166150/how-do-tell-a-wcf-client-proxy-class-to-use-Windows-authentication-and-the-wind – Mahol25

+0

CredentialCache powinien działać. Czy możesz sprawdzić WindowsIdentity.GetCurrent i zobaczyć, czy naprawdę jest zalogowany użytkownik? –

Odpowiedz

0

Trzeba zrobić personifikacji, na przykład:

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = 
    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

//Insert your code that runs under the security context of the authenticating user here. 

impersonationContext.Undo(); 

http://support.microsoft.com/kb/306158

Albo można użyć web.config:

<identity impersonate="true" /> 
+1

Dzięki, ale używam jako usługa Windows, a nie jako strona ASP. Wszystkie sugestie, które do tej pory znalazłem, są związane z ASP. Próbowałem już podszywania się, ale to nie pomaga/działa (w tym kontekście). Jestem zdumiony, że wydaje się, że nie ma sposobu na zdobycie poświadczeń bieżącego użytkownika (który jest w końcu zalogowany), i zamiast tego należy napisać jakąś hackowatą metodę przechowywania nazwy użytkownika i hasła. Yuk! (dzięki za sugestię) –

2

masz próbował WindowsIdentity.GetCurrent()?

można również spojrzeć na ten przykład ... http://www.codeproject.com/KB/vb/Windows_Service.aspx

+0

"Czy próbowałeś WindowsIdentity.GetCurrent?" Tak, to nie wydaje się, aby pomóc - nawet jeśli przekazać wynik do Personifikowanie Przykład właśnie wydaje się być interesującym sposobem, aby uzyskać aktualny login Dzięki –

0

Idealna sytuacja bezpieczeństwa jest to, że hasło zalogowanego użytkownika nie jest nigdzie zapisane w pamięci urządzenia. Nie jest też przechowywany w dowolnym miejscu na dysku. Istnieje tylko jako wartość hash do porównania z ciągiem wprowadzonym przez istotę ludzką. Przechowywanie hasła w sposób jawny jest z natury zagrożeniem bezpieczeństwa i powinno się go unikać, gdy tylko jest to możliwe.

Zgodnie z tą zasadą, NIE ma części systemu operacyjnego, która nawet MA hasło użytkownika w sposób przejrzysty, a tym bardziej gotów przekazać go użytkownikowi.

+5

Wydaje się być pewne. (?). zamieszanie tutaj Nigdy nie pytałem, jak uzyskać hasło. Zapytałem, biorąc pod uwagę, że mam proces, który musiał być "zalogowany" (z braku lepszego terminu), działa z ważnymi danymi uwierzytelniającymi. do komponentu trzeciej strony - nie musiałem wiedzieć, czym one są, wiedziałem, że stworzyłem nowy zestaw poświadczeń (zakładając, że znam hasło), ale działało, ale nie mogłem znaleźć sposobu na uzyskanie (i przekazuj dalej) * bieżące * dane uwierzytelniające –

+0

Dokładnie opisywałem tę sytuację.Aby uzyskać bieżące dane uwierzytelniające, musiałyby one BYĆ PRZEZ gdzieś. To zmniejszyłoby bezpieczeństwo systemu. Personifikacja powinna zezwalać na dowolny komponent, który chcesz wywołać _act_ jako zalogowany użytkownik bez konieczności posiadania rzeczywistych danych uwierzytelniających. Nie jestem pewien, dlaczego mnie zarzuciłeś, a nie pierwszą odpowiedź na to stanowisko, które złożyło takie samo oświadczenie na temat bezpieczeństwa ("W rzeczywistości jest to niebezpieczna praktyka"). –

+0

Posiadanie podpisanego tokena reprezentującego poświadczenia bieżącego procesu (które mogą wykonywać czynności, w tym rozmawianie z innymi programami, tak jak sam proces), nie jest tym samym, co posiadanie poświadczeń. Ponieważ istnieje wiele sposobów, że proces może komunikować się z innym procesem, jest to konfigurowalne. Przekazanie tego tokena jako argumentu jest oczekiwanym sposobem określenia, że ​​chcemy uwierzytelnić "jako ja" i nie używać niektórych nowych poświadczeń. To wszystko, co próbujemy zrobić. –

-1

jeśli chcesz po prostu uruchomić proces jako bieżący użytkownik dodaje czasownika: "runas " & Environment.UserName

Jeśli chcesz uruchomić proces jako administrator po prostu napisał "runas"

w VB.NET

Dim ps As New System.Diagnostics.ProcessStartInfo("filepath", "arguments") 

ps.Verb = "runas" 'run as admin 

'ps.Verb = "runas " & Environment.UserName'run as current user, by default 

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(ps) 

Jeśli chcesz uzyskać aktualne hasło użytkownika, nie możesz, w rzeczywistości jest to niebezpieczne ćwiczenie. Jakie prawa iw jakim celu Twoja usługa musi uzyskać moje hasło do systemu Windows w tajemnicy? na przykład jest jak podanie kodu PIN w telefonie do WhatsApp

+1

To nie odpowiada na pytanie. – MgSam

0

Czy próbowałeś ustawić główną politykę dla aplikacji na początku aplikacji?

Ustawienie tej wartości przed uzyskaniem dostępu do bieżącego obiektu głównego za pośrednictwem wątku zapewnia, że ​​tożsamość systemu Windows jest używana w tym obiekcie.

edycja - Jestem prawie pewien, że działa to dla DefaultNetworkCredentials. Użyłem go do uzyskania dostępu do usługi sieciowej z uwierzytelnianiem Windows z aplikacji formularzy Windows.

Powiązane problemy