14

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 が返されます。

4

1 に答える 1