我正在做一个需要以下内容的项目。
- 服务器端的 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证书的情况下获得消息或传输级别的安全性。该产品将进入数百台令人难以置信的锁定机器,并且无法安装证书。
有没有办法在不安装证书的情况下完成我的要求?