2016-07-26 8 views
3

私はMicrosoftによってクラウドでホストされているCRM Onlineの複数のインスタンスを持っています。
これらはすべて、ADFSによって管理されている同じAzure Active Directoryで保護されています。
私のアプリケーションはAzure ADに登録されているため、クライアントID /キーなどがあり、CRMへのアクセス権があります。ADAL/OAuthを使用してCRMオンラインで認証し、トークンを介してデータを要求するにはどうすればよいですか?

Web APIを使用してCRMの特定のインスタンスに接続して、データを要求したいとします。
CrmServiceClientを使用して、ユーザー名/パスワードを含む接続文字列を使用すると、これを実行できます。
これはよく書かれている例のようですが、私はこれをしたくありません。 (私はセキュリティのためのいくつかの詳細を不明瞭にしている)私は正常にこのようなトークンを取得することができますhttps://msdn.microsoft.com/en-us/library/gg327838.aspx

:次のMSDNの記事は、私が代わりにトークンを経由して、それを行うことができますように見えます

var tenantName = @"myorg.onmicrosoft.com"; 
var authString = string.Format(@"https://login.microsoftonline.com/{0}", tenantName); 

var authContext = new AuthenticationContext(authString, false); 

// I am in the UK so use crm4 
var resource = @"https://myorg.crm4.dynamics.com"; 
var clientId = @"899ac540-2134-1234-abcd-2d6440046630"; 
var key = @"nStbgtfe0oybU1P5+/FQ4wFn1oLTEDr5M7Kjrghf5yh="; 
var clientCred = new ClientCredential(clientId, key); 

var authResult = await authContext.AcquireTokenAsync(resource, clientCred); 

通常I」を最後に、私はSERVを追加する必要がhttp://crmtipoftheday.com/2015/06/24/you-have-oauth-token-now-what/

var orgService = new OrganizationWebProxyClient(
    new Uri("https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc"), false) 
{ 
    HeaderToken = authResult.AccessToken, 
    SdkClientVersion = "8" 
}; 

:このブログで認証ヘッダーが、オプション3は、それが代わりにSDKが提供するOrganizationWebProxyClientクラスを使用することが可能です示唆するようにHttpRequestにこのトークンを渡すdはマイクロソフトが提供する組織サービスへの氷の参照:

<system.serviceModel> 
    <bindings> 
    <customBinding> 
     <binding name="CustomBinding_IOrganizationService"> 
     <textMessageEncoding /> 
     <httpsTransport /> 
     </binding> 
    </customBinding> 
    </bindings> 
    <client> 
    <endpoint address="https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc" 
    binding="customBinding" bindingConfiguration="CustomBinding_IOrganizationService" 
    contract="CRMOrgService.IOrganizationService" name="CustomBinding_IOrganizationService" /> 
    </client> 
</system.serviceModel> 

をそして私が組織のサービスにこれを割り当てることができます:

var binding = new CustomBinding("CustomBinding_IOrganizationService"); 
orgService.Endpoint.Binding = binding; 
これは私のapp.configのバインディングを作成します

https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc?singleWSDL&sdkversion=8 

最後に、私はウェブサービスを呼び出すことができます:

var contacts = orgService.RetrieveMultiple(new QueryExpression 
{ 
    EntityName = "contact", 
    ColumnSet = new ColumnSet("firstname", "lastname") 
}) 
.Entities 
.Select(item => item.ToEntity<Contact>()); 
私はこのエラーは、実際に本物の誤差が(おかげで、マイクロソフト)だったので、私は本当に間違っているのか分からないものは何でも飲み込ん信じるように導かてる

An error occurred when verifying security for the message

しかし、組織のサービスを呼び出すときに、私はエラーを取得します。
オンラインのドキュメントでは、クライアントとサーバーの時間が同期していないと言われていますが、それはこれだとは思いません。マイクロソフトのサーバーはいつ稼動しているのかはわかりませんが、私の時計は絶対に正確で、英国の適切なタイムゾーンです。

誰かが間違っていることを知っていますか?
また、ユーザー名/パスワードなしで認証する別の方法がありますか?
または、私は間違ったツリーを吠えるだけですが、結局ユーザ名/パスワードを使用する必要がありますか?

+0

1.組織内にアプリケーションユーザーを追加しましたか? 2.なぜこのカスタムバインディングがすべてconfigに必要ですか? – georged

+0

この質問は一年半ほど前ですが、私はこれをずっと前から見ていませんでした。ごめんなさい。 – Equalsk

+0

ああ、それはそれを説明する:)申し訳ありませんが、誰かがそれについて私に尋ねたと私は日付を見ていない... S2Sは1.5年前に働いていなかった、それはカップルの月以来、CRMだけでサポートされています。今は100%働いています。 – georged

答えて

1

CRM Onlineは匿名またはパッシブ認証をサポートしておらず、有効なユーザー名とパスワードを常に提供する必要があります。

私は単にAPIアクセス専用のユーザーを作成し、これらの資格情報を使用してCRMで認証することに頼っていました。これは私が望んでいたものではありませんが、正常に動作します。

私は誰かが間違っていることを証明するのが大好きですが、今は可能ではないようです。

関連する問題