2008-08-27 111 views
1

在使用基於WCF構建的API時,確保只需要驗證一次的最佳方法是什麼?如何在WCF中使用客戶端憑據進行身份驗證?

我現在的綁定和行爲列舉如下

<bindings> 
     <wsHttpBinding> 
      <binding name="wsHttp"> 
       <security mode="TransportWithMessageCredential"> 
        <transport/> 
        <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="NorthwindBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceAuthorization principalPermissionMode="UseAspNetRoles"/> 
       <serviceCredentials> 
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/> 
       </serviceCredentials> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 

接下來是我在用我的客戶端應用程序來驗證(目前我必須這樣做,每次我想打個電話到WCF)

Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService") 
client.ClientCredentials.UserName.UserName = "foo" 
client.ClientCredentials.UserName.Password = "bar" 
Dim ProductList As List(Of Product) = client.GetProducts() 

我想要做的是使用這些憑證來驗證API,然後在客戶端應用程序使用Web服務項目的一段時間內獲取某種類型的令牌。我認爲establishsecuritycontext = true爲我做了這個?

回答

3

如果您使用的是Intranet,則可以通過配置單獨處理「免費」Windows身份驗證。

如果這不合適,令牌服務工作得很好,但在某些情況下,它們可能太多了。

我正在使用的應用程序需要裸機身份驗證。我們的服務器和客戶端在一個(非常安全的)內部網絡中運行,所以我們並不太在乎使用X.509證書來加密通信的要求,如果您使用用戶名認證,則需要這種證書。

因此,我們向客戶端添加了一個custom behavior,該客戶端向郵件標題添加了用戶名和(加密)密碼,並在服務器上添加了驗證它們的另一個自定義行爲。

所有非常簡單,不需要對客戶端服務訪問層或服務合同實現進行更改。而且這一切都是通過配置完成的,如果我們需要移動到更強一點的位置,移植起來會很容易。

1

雖然我不願意給出答案,但我並不是100%確定的,到目前爲止缺乏答案讓我認爲在這種情況下可能會有正確的答案。

據我所知,沒有那種會話令牌機制,你正在尋找與WCF的開箱即用,這意味着你將不得不做一些繁重的工作來獲得事情以你想要的方式工作。我應該明確WCF中有會話機制,但它着重於保證消息順序,並不是創建身份驗證會話的理想工具。

我剛剛完成的,我們實現了自己的會議機制,以處理遺留的SOAP堆棧的所有方式的一個項目工作,但我相信,以實現身份驗證會話的推薦方法是使用一個安全令牌服務(STS),如Pablo Cibraro's

如果您想了解更多詳情,請留言,但我懷疑巴勃羅的博客將有足夠的信息讓您前進。

相關問題