2012-07-17 73 views
3

我们正在开发一个WCF服务来容纳我们的核心API。WCF和多种安全模式

我们正在研究2个客户端使用此API,其中一个WPF桌面应用程序很可能会对活动目录进行身份验证,并与API位于同一个域中。另一个是ASP.Net Web应用程序,它很可能使用ASP.Net成员身份来实现安全性,并且仍然位于与WCF服务相同的域中。该计划是为WCF服务使用NetTcp并托管在Windows服务中。

在可能的情况下,我希望WCF服务作为主叫用户运行,我猜这对于用户是域用户的桌面应用来说应该是相当直接的。对于Web应用程序,我想我需要创建一个用户来进行服务调用。

是否有可能通过单一的WCF服务获得这种双重安全方法来运行,还是需要使用它自己的安全模型创建两个服务?

此外,如果任何人有任何想法的最佳做法/模式实现这将是伟大的。

感谢

+0

安全性[应用于端点](http://msdn.microsoft.com/zh-cn/library/ms731199.aspx),所以可以,您可以添加多个端点(每个端点都有自己的安全参数)以相同的服务。看看[impersonation](http://msdn.microsoft.com/en-us/library/ms730088.aspx)让外部用户像其他人一样运行。 – CodeCaster 2012-07-19 13:53:40

回答

4

我通过以下方式解决同样的问题:

  1. 我创建了两个的net.tcp在每次使用绑定。

    <security mode="TransportWithMessageCredential"> 
        <transport clientCredentialType="" /> 
        <message clientCredentialType="UserName" /> 
        </security> 
    
    </binding> 
    <binding name="WindowsBinding" > 
    
        <security mode="TransportWithMessageCredential"> 
        <transport clientCredentialType="Windows" /> 
        </security> 
    
    </binding> 
    

  2. 接下来,我添加了两个端点每个服务

    <service name="SimplePluginService" behaviorConfiguration="CommonBehavior"> 
    
        <endpoint binding="netTcpBinding" bindingConfiguration="UserNameBinding" name="SimplePluginServiceUserName" contract="ISimplePluginService"> 
         <identity> 
          <dns value="WCfServer" /> 
         </identity> 
        </endpoint> 
    
        <endpoint binding="netTcpBinding" bindingConfiguration="WindowsBinding" name="SimplePluginServiceWindows" contract="ISimplePluginService"> 
         <identity> 
          <dns value="WCfServer" /> 
         </identity> 
        </endpoint> 
    
    </service> 
    
  3. 接下来,我选用合适的端点,当我创建的ChannelFactory(的ConnectionManager - 类,其中包含有关用户信用的信息)。

    private readonly Dictionary<Type, Object> channelFactoryDictionary = new Dictionary<Type, Object>(); 
    
    private ChannelFactory<T> GetChannelFactory<T>() where T : class 
    { 
        if (channelFactoryDictionary.Keys.Contains(typeof(T))) 
        { 
         return channelFactoryDictionary[typeof(T)] as ChannelFactory<T>; 
        } 
        else 
        { 
         string endpointName=typeof(T).ToString(); 
         if (ConnectionManager.IsWindowsAuth) endpointName+="Windows"; 
         else endpointName+="UserName"; 
    
         ChannelFactory<T> channelFactory = new ChannelFactory<T>(endpointName); 
    
         if (!ConnectionManager.IsWindowsAuth){ 
          channelFactory.Credentials.UserName.UserName = ConnectionManager.Password; 
          channelFactory.Credentials.UserName.Password = ConnectionManager.Password; 
         } 
    
         channelFactoryDictionary.Add(typeof(T), channelFactory); 
         return channelFactory; 
        } 
    } 
    
0

你在这里混为一谈了几个不同的问题。首先,我声称你的主机(Windows服务)和传输(这里以netTcp的形式给出)大多与你的认证/授权选择无关,除非你想依赖ASP.NET成员资格,在这种情况下,你会想要IIS来托管你的服务。

模拟对于桌面或精心策划的LDAP环境中的访问控制来说无疑是一种体面的方法;不过,我倾向于发现,随着服务的增长,业务需求偏离Active Directory中(或可能)所代表的策略。一旦发生这种情况,您的服务就会开始需要更多的支持,以保持Windows模拟正常工作。这通常意味着处理WCF的可扩展性。

从多年的经验来看,使用WCF安全延伸点与几乎麻醉的根管一样痛苦。也就是说,一旦这项痛苦的工作完成,它就非常强大。

我发现,一般来说疼痛越少越好。我可以通过在我的代码中明确建模访问限制来获得模拟的安全优势,例如使用基于声明的安全性和CAS属性。采取这种方法,一个自定义的实现类可以避免模仿的需要,并与此一起使用WCF管道模糊不清。

这不是你想要的答案,但是这些都是我的两分钱。