2

我有一个 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 中……什么都没有。

我在这里想念什么?

4

8 回答 8

4

您是否检查过这篇关于自定义验证器的文章:http: //www.leastprivilege.com/FinallyUsernamesOverTransportAuthenticationInWCF.aspx

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

于 2009-01-01T18:00:00.600 回答
2

是的,我有,显然如果您不使用 SSL,.Net 会引发异常。显然,如果没有 SSL,您将无法做我想做的事。

于 2008-12-19T15:46:34.857 回答
1

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

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

于 2009-03-03T00:48:33.047 回答
0

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

于 2008-12-19T11:51:00.260 回答
0

据我了解,WCF 进行消息级别身份验证,而不是集成身份验证。无论哪种情况,我都不确定传递凭据是否可以在没有 SSL 的情况下完成...

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

我找到的一些链接...

于 2008-12-21T10:56:29.090 回答
0

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

您可以通过 访问用户名ServiceSecurityContext.Current.PrimaryIdentity,我不相信您可以轻松访问密码。

我在网上找到的一个我不太喜欢的建议是让您的自定义验证器保留用户名和密码的字典,稍后您可以在给定用户名的代码中访问该字典。

我不喜欢这个有几个原因 - 一 - 你真的不应该访问密码,二 - 我不确定这有多安全,三 - 如果可能有重复的用户名(我知道一些在这种情况下的系统)您最终可能会得到错误的系统。

于 2009-01-01T08:21:35.573 回答
0

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

System.ServiceModel.ServiceSecurityContext.Current.PrimaryIdentity.Name

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

于 2009-05-22T11:21:40.020 回答
0

如何:使用自定义用户名和密码验证器

于 2009-05-22T11:51:44.750 回答