2014-10-08 131 views
2

我的目標很簡單。使用Dynamics CRM 2013 API並給出url,用戶名,密碼和域,我如何檢查這些值是否有效?需要驗證CRM憑據

我有一個將使用API​​的自定義應用程序。我有一個設置屏幕,用戶將輸入URL,用戶名,密碼和域。我還有一個名爲「測試連接」的按鈕,它將驗證它是否可以使用該信息進行連接。

這裏是我用來創建連接的邏輯:

string connectionString; 
if (_crmDomain != "") 
    connectionString = string.Format(@"Url={0}; Username={1}\{2}; Password={3}", url, domain, userName, password); 
else 
    connectionString = string.Format(@"Url={0}; Username={1}; Password={2}", url, userName, password); 

var css = new ConnectionStringSettings("CRMConnectionString", connectionString); 
var cn = new CrmConnection(css); 
var service = new OrganizationService(cn); 

的問題是,即使證書是無效的(也許是不正確的密碼),創建新OrganizationService線路工作正常。有什麼辦法可以在實際的通話最終成功時檢查它是否能夠正常工作?

現在我正在通過撥打虛擬電話來解決這個問題。這迫使它創建連接。以下是我在做什麼:

var request = new RetrieveAllEntitiesRequest(); 
request.EntityFilters = EntityFilters.Entity; 
service.Execute(request); 

如果憑據無效,則service.Execute行會引發異常。這工作正常與一個問題。假設用戶輸入了有效的憑證併成功單擊了測試連接。現在讓我們假設他們將密碼更改爲錯誤,然後單擊測試連接。在這種情況下,它仍然是成功的。它似乎使用以前存在的連接。有沒有辦法消滅或清除以前的連接,以便當我嘗試使用無效的值時,它會引發異常?

同樣,我的總體目標是驗證登錄值。無論提供什麼最好的方式來實現這一點,都是我所追求的。謝謝!

+0

http://msdn.microsoft.com/en-us/library/hh675404.aspx?cs-save-lang=1&cs-lang=csharp #code-snippet-1 – Donal 2014-10-08 22:54:31

回答

3

刪除使用ConnectionStringSettings並使用CrmConnection.Parse()

var cn = CrmConnection.Parse(connectionString); 
var service = new OrganizationService(cn); 

try 
{   
    service.Execute(new WhoAmIRequest()); 
} 
catch (Exception ex) 
{ 
    //Do something because connection setup was bad 
} 

修訂

我跑了下面的代碼,並獲得期望的輸出,代碼如下所示。當密碼更改爲錯誤的密碼時,請求將失敗,並且在更改爲正確的密碼時會成功。

var connectionString = @"Url=https://server.com/orgname/;Username=domain\username;Password=goodpassword;"; 
var cn = CrmConnection.Parse(connectionString); 
var service = new OrganizationService(cn); 

try 
{   
    service.Execute(new WhoAmIRequest()); 
    Console.WriteLine("Good Password"); 
} 
catch 
{ 
    Console.WriteLine("Bad Password");  
} 

connectionString = @"Url=https://server.com/orgname/;Username=domain\username;Password=badpassword;"; 
cn = CrmConnection.Parse(connectionString); 
service = new OrganizationService(cn); 

try 
{   
    service.Execute(new WhoAmIRequest()); 
    Console.WriteLine("Good Password"); 
} 
catch 
{ 
    Console.WriteLine("Bad Password");  
} 

connectionString = @"Url=https://server.com/orgname/;Username=domain\username;Password=goodpassword;"; 
cn = CrmConnection.Parse(connectionString); 
service = new OrganizationService(cn); 

try 
{   
    service.Execute(new WhoAmIRequest()); 
    Console.WriteLine("Good Password"); 
} 
catch 
{ 
    Console.WriteLine("Bad Password");  
} 

輸出到控制檯是:

Good Password 
Bad Password 
Good Password 
+0

謝謝。使用這種方法很有趣,在成功打開連接之後,如果我將URL或用戶名更改爲無效,那麼當我再次嘗試時會失敗。但是,如果我將密碼更改爲無效,它仍然是成功的。所以這樣做效果更好但不完全。 – Chris 2014-10-09 18:15:38

+0

請張貼額外的代碼來演示整個過程,以便我們可以嘗試重現。我用我能夠成功執行的代碼更新了我的答案。 – Nicknow 2014-10-09 20:27:02