使用来自oauth2 / token的电子邮件地址和应用密码获取访问令牌

时间:2017-05-23 10:27:07

标签: c# asp.net-mvc oauth-2.0 azure-active-directory

我们对Active Directory下的电子邮件地址使用强制性双因素身份验证。

我有一个需要服务帐户的应用,因此我们为该服务帐户创建了应用密码。我们使用以下终点获取访问令牌 -

https://login.windows.net/{tenant_id}/oauth2/token

对于凭据没有双重身份验证和普通密码,它完全正常,但对于具有双因素身份验证和应用密码的帐户

则无效

如果我们输入应用密码,则会返回此错误 -

  

AADSTS70002:验证凭据时出错。 AADSTS50126:用户名或密码无效   enter image description here

我怎样才能让它发挥作用?

提前致谢

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试使用资源所有者密码凭据授予,in general not recommended(它不支持MFA等) 而不是使用该流程,看看client credential flow(您可以使用应用程序ID +秘密或证书)是否符合您的需求

对于CRM Online,它确实支持“application user”的概念。您在AAD中使用机密或证书声明应用程序。然后,您转到CRM Online并添加具有自定义安全角色的“应用程序用户”。

enter image description here

然后您可以使用这样的代码来访问CRM Web服务。

add-type -path "Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
add-type -path "Microsoft.Xrm.Sdk.dll"
$resourceAppIdURI = "https://ORG.crm2.dynamics.com"
$authority = "https://login.windows.net/TENANT.onmicrosoft.com" 
$credential=New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential("b1d83e4e-bc77-4919-8791-5408746265c1","<SECRET>")
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority,$false
$authResult = $authContext.AcquireToken($resourceAppIdURI, $credential)
$sdkService=new-object Microsoft.Xrm.Sdk.WebServiceClient.OrganizationWebProxyClient("https://ORG.crm2.dynamics.com/xrmservices/2011/organization.svc/web?SdkClientVersion=8.2",$false)
$sdkService.HeaderToken=$authResult.accesstoken
$OrganizationRequest=new-object Microsoft.Xrm.Sdk.OrganizationRequest
$OrganizationRequest.RequestName="WhoAmI"
$sdkService.Execute($OrganizationRequest)