没有证书的 WCF 用户名

Posted

技术标签:

【中文标题】没有证书的 WCF 用户名【英文标题】:WCF username without certificate 【发布时间】:2010-09-27 15:06:30 【问题描述】:

我正在做一个需要以下内容的项目。

服务器端的 WCF 服务 (.NET 3.5) 客户端的 WPF 客户端 (.NET 3.0)

我有一个现有的应用程序,我必须使用来自(在服务器端)的身份验证和授权。我还需要在 WCF 服务的线程主体(站点对象)中存储一些关于用户的元数据。我这样做是为了在必要时可以在 WCF 服务中使用它;一些业务逻辑可能需要它。所以我的计划是做以下事情......

为服务器创建一个自定义 ServiceAuthorizationManager,我将在其中登录用户并从现有应用程序中获取角色。我将缓存“站点”对象,并根据进一步的请求从缓存中提取。我还需要一个 CustomPrincipal 对象来保存我的自定义数据。我想模拟用户,以便可以像这样使用 WCF 中的内置角色过滤:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username)

我尝试将 ASP.NET 授权与自定义角色提供程序一起使用,但无法在 Current Principal 上设置任何内容。我还尝试使用自定义 IAuthorizationPolicy,但出现了问题。这些问题涉及能够使用 WCFClient.exe 应用程序,当它发现(使用 mex 端点)时,它不会提供任何凭据,因此登录会失败。我最终认为 ServiceAuthorizationManager 是正确的选择,但我愿意接受其他建议。

在客户端,我将收集凭据并将它们放入 WCF 代理类,如下所示。

proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;

当我开始走这条路时,我注意到我无法在我的管理器类的 CheckAccessCore 方法中获取用户名/密码。进一步调查表明,我真的应该在自定义 UserNamePasswordValidator 中进行身份验证。所以我创造了其中之一。问题是 validate 方法从未被调用过。

进一步调查表明,要调用 validate 方法,我的 WCF 服务必须具有消息或传输级别的安全性。问题在于,如果没有X.509 证书,我无法弄清楚如何获得消息或传输级别的安全性。该产品将进入数百台令人难以置信的锁定机器,并且无法安装证书。

有没有办法在不安装证书的情况下完成我的要求?

【问题讨论】:

【参考方案1】:

其实是可以的,但是你需要实现自己的绑定。

Yaron Naveh 开发了一个 WCF 绑定,可以通过 HTTP 启用明文用户名/密码。他的article 包含绑定代码。

【讨论】:

【参考方案2】:

简答;你不能。一旦您使用用户名/密码,您就需要某种安全通道。

但是您不需要客户端上的证书;仅在服务器上。

【讨论】:

【参考方案3】:

我不知道您的网络基础架构的详细信息,但如果您在 Windows 域中,您应该考虑使用 Windows 凭据。

如果您使用 Windows 凭据,则可以使用没有证书的消息安全性。这是 wsHttpBinding 的默认行为(开箱即用)。

使用开箱即用的解决方案(不实现您自己的绑定)WCF 鼓励(要求)您在消息中包含身份验证凭据时使用安全通道。

使用允许您以明文形式指定凭据的自定义绑定肯定是一种解决方案,但在使用它之前我会三思而后行。

【讨论】:

以上是关于没有证书的 WCF 用户名的主要内容,如果未能解决你的问题,请参考以下文章

WCF 客户端证书停止工作

WCF 消息安全证书

WCF 服务中的自定义客户端证书和用户名验证

WCF SOAP 1.1 和 WS-Security 1.0、客户端证书传输身份验证、消息正文签名的服务证书、用户名令牌、密码摘要、随机数

使用证书的 WCF 传输安全性忽略链信任

没有 SSL 的 WCF 身份验证