2011-12-19 174 views
0

我已經構建了一個wcf Web服務,該服務只是將MS Dynamics SQL數據提供給CRM託管的Silverlight應用程序。目前,Web服務託管在IIS中,並且只能通過HTTPS使用,因此消息的內容是安全的。我現在準備實現與登錄到Silverlight客戶端應用程序的人員有關的下一級安全性。我想將這些信息傳遞給Web服務,然後在創建SQL Server連接對象時使用它。結果將是MS Dynamics數據庫將僅返回授權連接用戶查看的數據。WCF Web服務需要訪問用戶名和密碼信息

此模型與標準模型不同,該模型包含對給定用戶進行身份驗證以訪問Web服務。相反,在我的模型中,每個人都有權訪問Web服務,並且SQL查詢的結果基於給定用戶的用戶名和密碼。

For Clarification: Silverlight應用程序在用戶登錄到應用程序時收集用戶名和密碼。這是Web服務連接到SQL Server數據庫時最終需要由Web服務使用的信息。所以我的目標是讓Silverlight應用程序將用戶名和密碼傳遞給Web服務,以便Web服務可以在創建Connection對象時檢索並使用它。

我正在考慮的事情很簡單,只需將用戶名和密碼添加到每個Web服務請求。不過,我寧願能夠使用標準的方法來傳遞用戶憑據,但我似乎無法找到任何方法來獲得密碼。用戶名可通過OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name訪問。

任何想法?

+0

你應該明確你想傳遞的用戶名和密碼。是否僅限於Windows帳戶訪問CRM?域用戶在Intranet內部訪問Silverlight應用程序嗎?用戶是否在您的服務中通過他的域帳戶進行身份驗證? – 2011-12-19 18:27:14

+0

澄清 - Bob Jones已登錄到CRM。我需要在Web服務中使用Bob Jones用戶名和密碼。 Web Service託管在雲中,然後使用用戶名和密碼創建與另一臺服務器上託管的數據庫的連接。目前,Web服務使用默認的用戶名和密碼連接到數據庫,而我想用Bob Jones代替。 – 2011-12-19 20:15:47

+0

Bob Jones是Windows帳號?順便說一句。在操作處理過程中,沒有安全機制的構建會獲得密碼。你需要使用SQL憑據或Windows憑據創建連接嗎? – 2011-12-19 20:36:22

回答

0

您可以使用wsHttpBinding將憑據傳遞給您的服務,但這至少會要求您發送具有消息安全性的憑據。您可以將其與IIS中的匿名身份驗證結合使用。這樣,每個人都可以在傳輸級別上訪問服務,但您可以自己處理憑據。

爲了擴展,我有一個WCF服務在IIS中使用HTTPS和匿名身份驗證運行。在我的web.config我已經設置了的wsHttpBinding,像這樣:

<bindings> 
<wsHttpBinding> 
    <binding name="CredentialsBinding" /> 
     <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

在我的行爲,我已經建立了一個servicebehavior自定義用戶名/密碼驗證,像這樣:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="DefaultBehavior"> 
     <serviceCredentials> 
     <userNameAuthentication 
     userNamePasswordValidationMode="Custom" 
     customUserNamePasswordValidatorType="MyNamespace.CredentialValidator, MyNamespace"/> 
     </serviceCredentials> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

驗證程序是這樣的:

namespace MyNamespace.CredentialValidator 
{ 
    public class CredentialValidator: UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 
      // you can now handle the username and password passed to your service 
      // with a wsHttpBinding through HTTPS 
     } 
    } 
} 

--edit

羅裏的報春花描述你在做什麼可能尋找他的文章WCF Security: Getting the password of the user,使用CustomUserNameSecurityTokenAuthenticator獲取密碼以供進一步使用。

+0

感謝您的指導 - 你有一個例子嗎? – 2011-12-19 20:08:22

+0

我迄今爲止所做的研究表明,用戶名可用,但密碼是隱藏的祕密。 – 2011-12-19 20:16:47

+0

我意識到這一點,但這不是我的解決方案,因爲這發生在我的Web服務方法被調用之前。我需要使用我的Web服務方法中的相同信息。 – 2011-12-19 21:03:49

相關問題