【问题标题】:Need to validate CRM credentials需要验证 CRM 凭据
【发布时间】:2014-10-08 22:02:12
【问题描述】:

我的目标很简单。使用 Dynamics CRM 2013 API 并给定 url、用户名、密码和域,我如何检查这些值是否有效?

我有一个将使用 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 行将引发异常。这适用于一个问题。假设用户输入了有效凭据并成功单击了测试连接。现在假设他们将密码更改为错误,然后单击测试连接。在这种情况下,它仍然成功。它似乎使用了以前存在的连接。有没有办法清除或清除以前的连接,以便当我尝试使用无效值时会引发异常?

同样,我的总体目标是验证登录值。任何能提供实现这一目标的最佳方式的东西都是我所追求的。谢谢!

【问题讨论】:

标签: dynamics-crm


【解决方案1】:

放弃使用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

【讨论】:

  • 谢谢。有趣的是,使用这种方法,在我成功打开连接后,如果我将 URL 或用户名更改为无效的内容,那么当我重试时它会失败。但是,如果我将密码更改为无效的密码,它仍然是成功的。所以效果更好,但并不完全。
  • 请发布附加代码来演示整个过程,以便我们尝试重现。我用能够成功执行的代码更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2016-09-01
相关资源
最近更新 更多