2017-08-02 1 views
12

ダイナミックCRM 365 Web APIを使用するWebアプリケーションがあります。動的CRMは、ADFS上の依拠当事者として構成されています。 サーバーはWindows Server 2016で、すべてが敷地内にあり、Azureにはありません。私は、次の有効なトークンがある取得するためにやったダイナミックCRM Web APIにアクセスするためにWebAppをADFSに承認

:ADFSで

1)アプリケーショングループに行って、新しいサーバーアプリケーションを追加するには、クライアントIDを取っても、私のWebアプリケーション用のクライアントシークレットを生成します。

enter image description here

2)Active DirectoryにwebAppUser

3)アプリケーションIDとCRMにように私は自分のウェブを登録したとき、私は早くなったのClientIDをアプリケーションユーザをこのユーザーを追加する新しい新しいユーザーを追加します。 appをADFSに追加します。また、Entity Accountの完全なアクセス許可を持つ新しい役割を作成し、この役割をこのアプリケーションユーザーに割り当てます。

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を取得します。

私を助けてもらえますか?私は正しい道にいますか?もっと何をすべきか?私は、システムのユーザーを使用して有効なトークンを取得するために以下のコードを使用して、私のOAuthリクエストで、それの資格情報を送信しなければならなかった終わり

答えて

2

namespace TestApp.App_Start { 
public class CrmWebApiClient 
{ 
    private HttpClient _httpClient; 

    public CrmWebApiClient() 
    {  
     _httpClient = new HttpClient(); 
     _httpClient.BaseAddress = new Uri("https://crmUrl"); 
     _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     _httpClient.DefaultRequestHeaders.Add("OData-MaxVersion","4.0"); 
     _httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0"); 
    } 

    internal async Task Initilize() 
    { 
     try 
     { 

      var tokenClient = new HttpClient();    
      var content = new FormUrlEncodedContent(new[] { 
       new KeyValuePair<string,string>("client_id",_clientID), 
       new KeyValuePair<string,string>("client_secret",_clientSecret), 
       new KeyValuePair<string,string>("resource",_urlOfResource), 
       new KeyValuePair<string,string>("username",_usernameOfSystemUser), 
       new KeyValuePair<string,string>("password",_passwordOfSystemUser), 
       new KeyValuePair<string,string>("grant_type","password"), 
      }); 
      var res = tokenClient.PostAsync("https://adfsUrl/adfs/oauth2/token", content); 
      var respo = res.Result.Content.ReadAsStringAsync().Result; 
      var accesstoken = JObject.Parse(respo).GetValue("access_token").ToString(); 

      _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accesstoken); 

     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine($"Exception when requesting the bearer token from ADFS: {ex.Message} - {ex.InnerException?.Message}"); 
     } 

    } 

    internal async Task<string> GetAccountsAsync() 
    { 
     var result = string.Empty; 
     try 
     { 
      result = _httpClient.GetStringAsync("/api/data/v8.0/accounts").Result; 

     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine($"Exception when calling the CRM api: {ex.Message} - {ex.InnerException?.Message}"); 
     } 
     return result; 
    } 
} 
} 


// Use the above class like that 
var httpClient = new CrmWebApiClient(); 
httpClient.Initilize().Wait(); 
var result = httpClient.GetAccountsAsync().Result; 
+0

この何ADFSのバージョンですか?パスワードの付与はサポートされていますか?明らかに存在しますが、もう少し詳しく説明できますか? – davidcarr

+1

@davidcarr最新のADFSを使用しているWindows Server 2016 –

+0

@RickyStam同様の状況がありますが、システムユーザーが何を意味しているか分かりますか?すべてのユーザーは作成されていませんか? –

関連する問題