2010-02-23 120 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服务。

相关问题