2012-07-10 73 views
2

我已经创建了简单的.NET Web服务(ASMX),我从我的.NET Web应用程序调用。服务和Web应用程序都使用Windows验证。使用Windows身份验证从C#应用程序调用ASMX服务?

com.mydomain.MyWebService webSrvc = new com.mydomain.MyWebService(); 
string output = webSrvc.MyServiceMethod(); 

我现在的建立与C#Windows应用程序,并想从那里调用相同的Web服务。我在项目中为服务添加了一个Web引用,并且我可以毫无问题地调用服务Web方法。问题是,在Web方法中,我试图检索用户的Windows用户名。

string username = User.Identity.Name; //always blank 

这个工作,当我从我的web应用程序调用Web服务,但是当我把它从我的Windows应用程序,它总是返回空白,User.Identity.IsAuthenticated始终是假的,如果是相关的。我在这里错过了什么。我只需要获取运行控制台应用程序的Windows用户用户名即称为Web服务。我曾尝试将webSrvc的凭据设置为ClientCache默认凭据,但这并不能解决问题。

更新:我不知道这是否有用,但我了解到,如果我使用Environment.UserName,它会给“NETWORK_SERVICE”,然后如果我启用模拟,它会给“IUSR_ [host_name]” 。看来我只是错过了一些非常简单的事情。我只想获得当前正在运行Windows应用程序(调用Web服务)的Windows用户。

回答

2

在调用它之前是否将网络凭证传递给了您的Web服务对象?喜欢的东西:从

NetworkCredential credentials = new 
NetworkCredential(UserName,SecurelyStroredPassword,Domain); 

// Add the NetworkCredential to the CredentialCache. 
credentialCache.Add(new Uri(webSrvc.Url), 
        "Basic", credentials); 

那儿剽窃:http://msdn.microsoft.com/en-us/library/bfazk0tb.aspx

基本上当Web服务从Web应用程序叫你已经把所有的cookie和session信息坚持围绕。当你写一个独立的应用程序将无法访问饼干,表单数据等

+0

我使用默认凭据,因为我不知道公司中每个用户的密码。由于我使用禁用匿名访问的Windows身份验证,因此不应该这样工作。 – dave823 2012-07-24 20:27:46

+0

“因为我使用禁用匿名访问的Windows身份验证,所以不应该这样工作”。不,实际上。您使用的代码不会将凭据“传递”给您的Web服务对象。它在浏览器中工作,因为这是浏览器制造商(MS)打开的行为。但是,默认情况下,您的Windows窗体应用程序不会将所运行的凭据传递给Web服务。你必须明确地设置它。 – Richthofen 2012-07-24 20:56:55

+0

感谢您的意见。在您的代码示例中,我仍然不明白我是如何获得用户密码以传递到网络凭据的。我可以从Windows身份获取用户名和域名,但密码又如何?另外,我注意到您的代码使用“基本”身份验证。如果将IIS Web应用程序配置为“集成Windows身份验证”,这会工作吗? – dave823 2012-08-29 18:56:37

6

设置

UseDefaultCredentials = true; 

这将验证的currentuser(或当前运行进程的帐户)

相关问题