2010-02-23 11 views
28

Я пишу код для использования стороннего компонента, и мне нужно предоставить объект, который реализует ICredentials, когда я начну его использовать.Как получить учетные данные (NetworkCredential) текущего пользователя?

Если я напишу следующее ...

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

... и передать "удостоверение", это нормально. Но я хотел бы передать учетные данные текущего пользователя (это служба Windows, поэтому работает как указанный пользователь).

Я попробовал оба из следующих действий, но и не появляется на работе (или ничего возвращать):

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

Может кто-нибудь подскажет, как приобрести вывоза мебели объект, который представляет учетные данные пользователя, что служба работает под?

Спасибо, Росс

+0

См http://stackoverflow.com/questions/3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind Вам может понадобиться

+0

у меня такая же проблема с сценария клиента WCF см эту тему http://stackoverflow.com/questions/ 3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind – Mahol25

+0

CredentialCache должен работать. Вы можете проверить WindowsIdentity.GetCurrent и посмотреть, действительно ли зарегистрирован пользователь? –

ответ

0

Вы должны сделать олицетворения, например:

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

Или вы можете использовать web.config:

<identity impersonate="true" /> 
+1

Спасибо, но я работаю как служба Windows, а не как веб-страница ASP. Все предложения, которые я нашел до сих пор, связаны с ASP. Я уже пробовал олицетворение, но это не помогает/работает (в этом контексте). Я удивлен, что, похоже, не существует способа получить учетные данные текущего пользователя (который вошел в систему в конце концов) и вместо этого запрограммировать некоторый хакерский метод для хранения имени пользователя и пароля пользователя. Юк! (спасибо за предложение) –

2

иметь вас попробовал WindowsIdentity.GetCurrent()?

Вы также можете посмотреть на этом примере ... http://www.codeproject.com/KB/vb/Windows_Service.aspx

+0

«Вы пробовали WindowsIdentity.GetCurrent?" Да, похоже, не поможет - даже если передать результат в Олицетворять пример просто оказался интересным способом, чтобы получить текущее имя пользователя Спасибо –

0

Ситуация идеальной безопасности является то, что пароль вошедшего в систему пользователя не хранится в памяти. Он не хранится нигде на диске. Он существует только как хэш-значение для сравнения с строкой, введенной человеком. Хранение пароля в явном виде является, по сути, угрозой безопасности, и его следует избегать, когда это возможно.

Учитывая этот принцип, НИКАКОЙ части операционной системы нет, даже если у пользователя есть пароль пользователя, а тем более он готов предоставить его вам.

+5

Там, кажется, некоторые из них. (?). Я никогда не спрашивал, как получить пароль. Я спросил, учитывая, что у меня есть процесс, который должен быть «зарегистрирован» (из-за отсутствия лучшего термина), он работает с действительными учетными данными. для стороннего компонента - мне не нужно было знать, что это такое. Я знал, что он создал новый набор учетных данных (при условии, что я знал пароль), он работал, но я не мог найти способ приобрести (и передать) * текущие * учетные данные. –

+0

Это именно то, что я описывал. Чтобы получить текущие учетные данные, им нужно будет ПОМОГАТЬ некоторыми мягкими где-нибудь. Это снизит безопасность системы. Олицетворение должно позволять любому компоненту, который вы хотите вызвать, в _act_ в качестве зарегистрированного пользователя без фактических учетных данных. Я не уверен, почему вы отказали мне в этом, а не первый ответ на этот пост, в котором говорилось о безопасности («На самом деле это небезопасная практика»). –

+0

Имея подписанный токен, который представляет учетные данные текущего процесса (которым разрешено делать что-то, в том числе говорить с другими программами как сам по себе, как процесс), не совпадает с имеющимися учетными данными. Поскольку существует несколько способов, которыми процесс может разговаривать с другим процессом, это настраивается. Передача этого токена в качестве аргумента - это ожидаемый способ указать, что мы хотим аутентифицировать «как я» и не использовать некоторые новые учетные данные. Это все, что мы пытаемся сделать. –

-1

если вы просто хотите, чтобы запустить процесс, как текущий пользователь добавляет глагол: "runas " & Environment.UserName

Если вы хотите, чтобы запустить процесс, как администратор просто написал "runas"

в 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) 

Если вы хотите получить текущий пароль пользователя, вы не можете, на самом деле это небезопасная практика. Какое право и с какой целью ваш сервис должен получить секретный пароль для Windows? , например, как предоставление пин-код вашего телефона WhatsApp

+1

Это не отвечает на вопрос. – MgSam

0

К сожалению, вы должны Interop с WMI, как это:

http://www.codeproject.com/Articles/28161/Using-WMI-to-manipulate-services-Install-Uninstall

Значение, которое вы ищете для запроса является StartName, который будет оценивать что-то вроде «NT Authority \ NetworkService» (или независимо от того, что вы используете). Если вы перепутаете вторую часть этой статьи с первой частью получения, она должна быть довольно простой.

0

Вы пытались установить основную политику для приложения в начале приложения?

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

Установка этого значения перед доступом к текущему основному объекту с помощью нити удостоверяется идентичность окна используется в этом объекте.

Редактировать - Я уверен, что это работает для DefaultNetworkCredentials. Я использовал его для доступа к веб-службе с проверкой подлинности Windows из приложения Windows Forms.

Смежные вопросы