2010-02-23 118 views
28

我正在編寫一些代碼來利用第三方組件,並且我需要提供一個實現ICredentials的對象,當我開始使用它時。你如何獲得當前登錄用戶的憑據(NetworkCredential)?

如果我寫了下面......

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

...並通過 「憑證」,它的罰款。但我想通過當前用戶(它是Windows服務,因此作爲指定用戶運行)的憑據。

我已經試過兩個以下,但也出現工作(或任何回報)

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

任何人都可以建議如何獲取approriate對象,它代表了用戶名的憑據該服務正在運行?

感謝, 羅斯

+0

見http://stackoverflow.com/questions/3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind 您可能需要 2011-07-19 03:29:19

+0

我有一個WCF客戶端方案相同的問題,看到這個線程 http://stackoverflow.com/questions/ 3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind – Mahol25 2010-07-02 15:12:02

+0

CredentialCache應該可以工作。你可以檢查WindowsIdentity.GetCurrent,看看有沒有用戶登錄? – 2011-11-19 09:08:31

回答

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有關。我已經嘗試過模擬,但它並沒有幫助/工作(在這種情況下)。 令人驚訝的是,似乎沒有辦法獲取當前用戶(畢竟是登錄的用戶)的憑據,而是編寫一些hacky方法來存儲用戶的用戶名和密碼。喔! (謝謝你的建議雖然) – 2010-03-17 17:00:36

2

有你試過WindowsIdentity.GetCurrent()?

你也可以看看下面這個例子... http://www.codeproject.com/KB/vb/Windows_Service.aspx

+0

「你有沒有試過WindowsIdentity.GetCurrent?「 是,它似乎並沒有幫助 - 即使你通過結果爲假冒 的例子只是似乎是一個有趣的方式來獲取當前用戶名 感謝 – 2010-04-12 13:23:34

0

理想的安全狀況是一個登錄的用戶沒有在存儲器中的任何存儲的密碼。它不存儲在磁盤的任何地方。它僅作爲一個散列值與人類輸入的字符串進行比較。明確存儲密碼本質上是一種安全風險,應儘可能避免。

根據這個原則,操作系統中沒有任何部分甚至可以讓用戶的密碼清晰,更不用說願意給你。

+5

似乎有一些(?)。我從來沒有問過如何獲得密碼,我問,鑑於我有一個必須「登錄」(爲了更好的術語)的過程,它正在運行有效的憑據,我想通過那些到第三方組件 - 我不需要知道它們是什麼,我知道它創建了一組新的憑據(假設我知道密碼),但是我找不到一種方法來獲取(並傳遞)當前*憑證 – 2012-06-13 12:31:19

+0

這正是我所描述的情況,要獲得當前憑證,他們必須被某些軟某處的器皿。這會降低系統的安全性。 模擬應允許您希望以_act_作爲登錄用戶調用的任何組件,而無需實際憑據。我不確定你爲什麼低估了我,而不是這篇文章的第一個答案,這個答覆對安全做出了同樣的陳述(「實際上這是一種不安全的做法」)。 – 2012-09-02 01:55:54

+0

擁有一個代表當前進程(允許執行任務,包括像其他程序一樣與進程交談)的憑證的簽名令牌與擁有憑證不同。由於進程可能與另一個進程交互的方式有多種,因此這是可配置的。將此標記作爲參數傳遞是指定我們想要「作爲我自己」進行身份驗證並且不使用某些新憑據的預期方式。這就是我們想要做的。 – 2013-12-02 19:46:54

-1

,如果你只是想運行一個進程作爲當前用戶添加動詞: "runas " & Environment.UserName

如果要以管理員身份運行只是在vb.net中寫道:"runas"

過程

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密碼的祕密? 例如就好像給你的手機的PIN碼的WhatsApp

+1

這不回答問題。 – MgSam 2013-06-17 19:53:47

0

您是否嘗試過在應用程序的開始處爲appdomain設置principalpolicy?

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

通過設置線程訪問當前的主要對象之前,該值可以確保Windows標識是此對象使用。

編輯 - 我很確定這適用於DefaultNetworkCredentials。我用它通過Windows窗體應用程序的Windows身份驗證訪問Web服務。

相關問題