我们有一个Azure托管的“内部部署”Dynamics 2016实例,作为使用ADFS身份验证的IFD运行 . 我们现在要求Azure托管API使用CRM Web API与Dynamics实例进行通信 . 为实现此目的,我们需要使用ADAL进行身份验证,使用ADAL,如此处所述https://msdn.microsoft.com/en-gb/library/gg327838.aspx,利用Microsoft.IdentityModel.Clients.ActiveDirectory库 . 我们有以下代码从ADFS检索令牌
var resource = "https://reosurce.com/";
var clientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
var authProvider = "https://adfs.server.com/adfs/oauth2/token";
var redirectUri = "https://crm2Environment.com/";
var authContext = new AuthenticationContext(authProvider, false);
var authToken = authContext.AcquireTokenAsync(resource, clientId, new
Uri(redirectUri), new PlatformParameters(PromptBehavior.Always)).
Result.AccessToken;
代码示例成功运行,但是用于交互式流程情况,并且一旦调用AcquireTokenAsync方法,就会出现登录对话框(这有意义,因为ADFS知道它是否可以进行身份验证),但这显然不会处理与域无关的API,并且无法将凭据传递给ADFS(不是我们想要的) . 在概述的情况下,AcquireTokenAsync方法的替代重载似乎都不适用于ADFS(但对建议持开放态度) . 我们错过了什么吗?是否有另一种方法可以使用非交互流/不使用域帐户身份验证来检索令牌?请记住,Azure AD可用的示例似乎不适用于ADFS方案,我们也不拥有或无权访问当前的ADSF服务器,因为这是由我们的基础架构团队管理的(尽管如果需要它们可以在ADFS上进行更改)
2 回答
您使用的是什么版本的ADFS?
如果ADFS 4.0和流是服务器到服务器(听起来像这样),请使用使用密钥知识的客户端凭证 - 没有登录/密码 .
好的链接here .
看看MSI(托管服务标识) . 这是Azure到Azure服务的新通信协议 .
Managed Service Identity (MSI) for Azure resources
在研究这个问题时,尽量不要混淆旧模式(对于Service-to-AzureService通信仍然有效)这是您在Azure上生成ClientId / ClientSecret / Url的权限,然后与Azure共享这些值 . 需要访问的应用程序 . 下面是一个示例Use Azure Key Vault from a Web Application该示例演示了如何连接到Azure Key Vault,但它可以是使用Azure Active Directory身份验证的任何Azure服务 .