我正在开展一个项目,我需要以下内容.
服务器端的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 endpoing)时它不会提供任何凭据,因此登录将失败.我最终认为ServiceAuthorizationManager是正确的方法,但我对其他建议持开放态度.
在客户端,我将收集凭据并将它们放入WCF代理类,如下所示.
proxy.ChannelFactory.Credentials.UserName.UserName = userName; proxy.ChannelFactory.Credentials.UserName.Password = password;
当我开始走这条路时,我注意到我无法在我的经理类的CheckAccessCore方法中获取用户名/密码.进一步调查显示我应该在自定义UserNamePasswordValidator中进行身份验证.所以我创造了其中之一.问题是验证方法永远不会被调用.
进一步的调查表明,为了调用validate方法,我的WCF服务必须具有消息或传输级安全性.问题在于,如果没有X.509证书,我无法弄清楚如何获得消息或传输级安全性.这个产品进入了数百个令人难以置信的锁定机器,并且无法安装证书.
有没有办法在没有安装证书的情况下做我要求的事情?
实际上它是可能的,但你需要实现自己的绑定.
Yaron Naveh开发了一个WCF绑定,通过HTTP启用明文用户名/密码.他的文章包括绑定的代码.
简短的回答; 你不能.只要您使用用户名/密码,就需要某种安全通道.
但是,您不需要客户端上的证书; 仅在服务器上.