Dynamics CRM 365 Web API と通信する必要がある Web アプリケーションがあります。Dynamics CRM は、ADFS の証明書利用者として構成されます。サーバーは Windows Server 2016 で、すべてオンプレミスであり、Azure ではありません。
有効なトークンを取得するために行ったことは次のとおりです。
1)ADFSでアプリケーショングループに移動し、新しいサーバーアプリケーションを追加し、ClientIDを取得して、Webアプリケーションのクライアントシークレットも生成しました。
2) Active Directory に webAppUser という新しいユーザーを追加します。
3) Web アプリを ADFS に登録したときに取得した ClientID のアプリケーション ID を使用して、このユーザーを CRM のアプリケーション ユーザーとして追加します。また、エンティティ アカウントに対する完全な権限を持つ新しい役割を作成し、この役割をこのアプリケーション ユーザーに割り当てます。
4) 以下のコードを使用して、ベアラー トークンを取得し、それを HttpClient Authorization ヘッダーに追加しています。
public class CrmWebApiClient
{
private HttpClient _httpClient;
public CrmWebApiClient()
{
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri("https://crmbaseaddress.com");
}
internal async Task Initialize()
{
try
{
var authority = "https://adfsServerUrl/adfs/";
var authContext = new AuthenticationContext(authority,false);
var credentials = new ClientCredential(clientID,clientSecret);
var authResult = await authContext.AcquireTokenAsync("https://crmbaseaddress.com", credentials);
_httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}
catch (Exception ex)
{
var error = ex;
}
}
internal async Task<string> GetValuesAsync()
{
var result = string.Empty;
try
{
result = await _httpClient.GetStringAsync("api/data/v8.1/accounts");
}
catch (Exception ex)
{
var error = ex;
}
return result;
}
}
5) なんとかトークンを取得できましたが、CRM の Web API を呼び出すと、まだ 401 Unauthorized が返されます。