2014-10-08 134 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