ASP.NET Compat模式下的WCF服务 - 传递用户名/密码的最简单方法是什么

时间:2008-12-16 19:27:26

标签: asp.net wcf web-services security http-headers

我有一个Web服务(WCF或ASMX没关系)...我已经创建了一个控制台应用程序,右键单击,添加了服务引用。到目前为止,非常好。

但是,我不能为我的生活传递“安全”凭据到我的服务。这是我的客户代码:

var client = new MyClient();

client.ClientCredentials.UserName.UserName = "bob";
client.ClientCredentials.UserName.Password = "123!!";

client.HelloWorld();

client.Close();

但是在服务器上,无论我做什么(打开和关闭aspnetcompant模式,wcf服务,asmx服务,自定义http处理程序等)......我找不到'bob:123 !!'任何地方。不在标题中,不在HttpContext.Current.User.Identiy.Name中,不在Thread.CurrentPrincipal中......没有。

我在这里缺少什么?

8 个答案:

答案 0 :(得分:4)

您是否在自定义验证器上查看了这篇文章:http://www.leastprivilege.com/FinallyUsernamesOverTransportAuthenticationInWCF.aspx

此外,在我处理此问题时帮助我的一件事是禁用对Web服务器的该目录的匿名访问。未经过身份验证时,HttpContext.Current.User.Identity.Name始终返回空字符串。因此,它看起来像您正确的身份验证,只是无法“找到”用户名,但实际上您是匿名登录的。至少在禁用匿名访问的情况下,您将获得异常,并且可以更容易地找出身份验证方面,这是最难的部分。

答案 1 :(得分:2)

是的我有,显然如果你不使用SSL,.Net会抛出异常。显然,如果没有SSL,你不能做我想做的事。

答案 2 :(得分:1)

有关TransportCredentialOnly能够在没有SSL的情况下传递用户名和密码的信息,请参阅:http://developers.de/blogs/damir_dobric/archive/2006/07/31/890.aspx

这应该只在TESTING环境中完成,因为您以纯文本形式公开了用户的密码。

答案 3 :(得分:0)

您是否在端点绑定上配置了UserName(邮件安全性)或Basic(传输安全性)客户端凭据类型?

答案 4 :(得分:0)

据我所知,WCF执行消息级别身份验证,而不是集成身份验证。在任何一种情况下,我都不确定传递凭据是否可以在没有SSL的情况下进行...

您是否尝试在端点上启用匿名身份验证(通过IIS)?据我所知,WCF使用消息级安全性(消息头中传递的用户名/密码)而不是HTTP头(用于集成的auth方法,如Windows Integrated,SPNego等)。

我发现了一些链接......

答案 5 :(得分:0)

如果我正确理解您的问题,您已成功为WCF服务配置了用户名验证(抱歉 - 我将专注于WCF),您希望能够访问您的服务方法中的用户名和密码。

您可以通过ServiceSecurityContext.Current.PrimaryIdentity访问用户名,我认为您无法轻松访问密码。

我在网上发现的一个我不太喜欢的建议是,您的自定义验证程序会保留用户名和密码的字典,您可以在以后的代码中使用用户名访问该字典。

我不喜欢这个有几个原因 - 一个 - 你不应该真的有权访问密码,两个 - 我不确定这是多么安全,三个 - 如果它可能有重复的用户名(我知道某些系统就是这种情况)你可能最终得错了。

答案 6 :(得分:0)

你试过这个吗? (特别是如果您使用自己的身份验证系统和自己的UsernamePasssword和证书验证器。

System.ServiceModel.ServiceSecurityContext.Current.PrimaryIdentity.Name

您可以获取来电者的姓名,但不能获取密码。

答案 7 :(得分:0)