2012-07-17 72 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管道模糊不清。

這不是你想要的答案,但是這些都是我的兩分錢。