我正在开展一个项目,我需要以下内容。
我有一个现有的应用程序,我必须使用(在服务器端)的身份验证和授权。我还需要在WCF服务的线程主体(站点对象)中存储有关用户的一些元数据。我这样做,以便我可以在WCF服务中获得它,如果我绝对必须;一些业务逻辑可能需要它。所以我的计划是做以下事情......
为服务器创建一个自定义ServiceAuthorizationManager,在那里我将登录用户并从现有应用程序中获取角色。我将缓存“站点”对象,并在进一步请求从缓存中拉出。我还需要一个CustomPrincipal对象来保存我的自定义数据。我想冒充用户,以便我可以在WCF中使用内置角色过滤,如下所示:
[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username){}
我尝试将ASP.NET授权与自定义角色提供程序一起使用,但我无法在Current Principal上设置任何内容。我还尝试使用自定义IAuthorizationPolicy,但出现了问题。这些问题涉及能够使用WCFClient.exe应用程序,当它发现(使用mex endpoing)时它不会提供任何凭据,因此登录将失败。我最终决定使用ServiceAuthorizationManager是正确的方法,但我愿意接受其他建议。
在客户端上,我将收集凭据并将它们放入WCF代理类中,如下所示。
proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;
当我开始走这条路时,我注意到我无法在我的经理类的CheckAccessCore方法中获取用户名/密码。进一步调查显示我应该在自定义UserNamePasswordValidator中进行身份验证。所以我创造了其中之一。问题是验证方法永远不会被调用。
进一步调查显示,为了调用validate方法,我的WCF服务必须具有消息或传输级安全性。问题在于,如果没有X.509证书,我无法弄清楚如何获得消息或传输级安全性。这个产品进入了数百个令人难以置信的锁定机器,并且无法安装证书。
有没有办法在不安装证书的情况下做我要求的事情?
答案 0 :(得分:22)
实际上这是可能的,但你需要实现自己的绑定。
Yaron Naveh开发了一个WCF绑定,通过HTTP启用明文用户名/密码。他的article包含了绑定的代码。
答案 1 :(得分:6)
简短回答;你不能。只要您使用用户名/密码,就需要某种安全通道。
但是,您不需要客户端上的证书;只在服务器上。
答案 2 :(得分:1)
我不知道您的网络基础架构的详细信息,但如果您在Windows域中,则应考虑使用Windows凭据。
如果使用Windows凭据,则可以使用不带证书的Message安全性。这是wsHttpBinding的默认行为(开箱即用)。
使用开箱即用的解决方案(无需实现自己的绑定)WCF鼓励(要求)您在消息中包含身份验证凭据时使用安全通道。
使用允许您以明文形式指定凭据的自定义绑定肯定是一种解决方案,但在使用它之前我会三思而行。