こんにちは。CData Software Japan リードエンジニアの杉本です。
前々からアナウンスが出ていましたが、Dynamics 365 / CRM(CDS・Dataverse)の Organization Service(いわゆるSOAP API) 認証手段の一つである、 WS-Trust 認証セキュリティ プロトコルが非推奨、というか廃止になりました。
それでも、なんだかんだで最近まで利用できていたのかな? と感じていたんですが、私が試している環境で正式なエラーをキャッチしました。
An error occurred when processing the security tokens in the message:You are using Ws-Tust authentication which has been deprecated and no longer supported in your environment. Please use oAuth2.0 authentication.
(ところで、このWs-Tustは誤字でしょうか? 正しくはWs-Trustのはずです。)
実際のレスポンスXMLは以下のとおりです。
<Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <Header> <Action s:mustUnderstand="1"> http://www.w3.org/2005/08/addressing/soap/fault </Action> <RelatesTo> urn:uuid:3f1be0e3-bc39-49e6-bfd1-15838e50e6d4 </RelatesTo> <ActivityId CorrelationId="1c4715a3-e969-469d-8f47-f0905494c426" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics"> 00000000-0000-0000-0000-000000000000 </ActivityId> <Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <Timestamp u:Id="_0"> <Created> 2020-12-15T11:37:59.404Z </Created> <Expires> 2020-12-15T11:42:59.404Z </Expires> </Timestamp> </Security> </Header> <Body> <Fault> <Code> <Value> s:Sender </Value> <Subcode> <Value xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> a:FailedCheck </Value> </Subcode> </Code> <Reason> <Text xml:lang="en-US"> An error occurred when processing the security tokens in the message:You are using Ws-Tust authentication which has been deprecated and no longer supported in your environment. Please use oAuth2.0 authentication. </Text> </Reason> </Fault> </Body> </Envelope>
使用しているのはDynamics CRM Driver です。
基本的にはエラーメッセージに書いてあるとおりで、「Ws-Trustはサポートしなくなったので、OAuth 2.0 Authenticationでアクセスしてね」ということで、この記事の大半は終わりですが、少し詳細と対処方法についてこの記事で紹介していきたいと思います。
そもそも Dynamics 365に接続するにあたり Ws-Trust authentication とは何をしていたのか?
詳細情報は Ws-Trust 公式リファレンスは下記を漁っていただくとして
SDKやCData Driverの中でも実はそんなに小難しいことをしているわけではありません。
ざっくり言ってしまえばSOAPリクエストで「https://login.microsoftonline.com/RST2.srf」に対して、ログインユーザーのID・PWを渡して、セキュリティトークンを取得するというものです。
CData Dynamics CRM Driverは以下のようなリクエストを発行して、セキュリティトークンを取得しています。仕組みさえわかっていれば、ハードコードできる内容です。
POST https://login.microsoftonline.com/RST2.srf HTTP/1.1 Host: login.microsoftonline.com Authorization: Basic XXXXXBasic Authenticaton CodeXXXXXXX Accept-Encoding: gzip, deflate User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip Content-Type: application/soap+xml Content-Length: 1878 <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soap:Header> <a:Action soap:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue </a:Action> <a:MessageID>urn:uuid:be5d59b9-68a4-462c-89c8-cd0935d0eddc </a:MessageID> <a:ReplyTo> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> </a:ReplyTo> <a:To soap:mustUnderstand="1">https://login.microsoftonline.com/RST2.srf </a:To> <o:Security soap:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <u:Timestamp u:Id="_0"> <u:Created>2020-12-15T11:37:56.755Z</u:Created> <u:Expires>2020-12-15T11:42:56.755Z</u:Expires> </u:Timestamp> <o:UsernameToken u:Id="uuid-14bed392-2320-44ae-859d-fa4ec83df57a-1"> <o:Username>XXXX@XXXX.onmicrosoft.com</o:Username> <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">USER_PASSWORD</o:Password> </o:UsernameToken> </o:Security> </soap:Header> <soap:Body> <t:RequestSecurityToken xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"> <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"> <a:EndpointReference> <a:Address>urn:crmjpn:dynamics.com</a:Address> </a:EndpointReference> </wsp:AppliesTo> <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue </t:RequestType> </t:RequestSecurityToken> </soap:Body> </soap:Envelope>
このリクエストでセキュリティトークンが発行されるので、それを続くリクエストに付与して、Organization Service の接続を行っています。
OAuth 2.0 はブラウザログインプロセスを通るので、このようにID・PWを内部的にやり取りすることはありません。そのため、ID・PWで接続を試みている連携ツールなどには注意しましょう。
以前私のBlogでも紹介したような、ClientCredentialsによる接続アプローチはありますが、おそらく明示的に利用を促しているものがほとんどです。
対処方法
前述の通り、OAuth 2.0を利用した接続に切り替える必要があります。
公式SDKを通じた対処方法は下記URLを参照してみてください。
続いてDynamics CRM Driverでの対処方法ですが
ここで注意していただきたいのは、Dynamics CRM Driver が利用しているSOAP API(Organization Service API)はすでに非推奨・将来的な廃止を予定しているということです。
そのため、基本的には最新のWeb APIを利用している以下の Dynamics 365 Sales Driverを利用しましょう。
こちらは標準でOAuth 2.0 の認証が使用されます。
どうしても、Dynamics CRM DriverでSOAP接続が行いたい! という場合には、OAuthアプリを自分で作成・登録し、接続することが可能になっています。
Dynamics CRM Driver で OAuth 2.0 による接続を行う方法
まず対象のテナントのAzure Adにアクセスし、アプリを新規登録します。
任意の名称を付与して
「任意の組織ディレクトリ内のアカウント(任意のAzure AD ディレクトリ-マルチテナント)」を指定
リダイレクトURIは「Web」の「http://localhost:33333」を指定します。もしクライアントアプリ以外の場合は、任意のURIを指定してください。
次に、APIのアクセス許可から、Dynamics CRMを選択し
「委任されたアクセス許可」にある「user_impersonation」を付与します。
あとは、クライアントシークレットを作成し
概要に存在するクライアントIDを取得すればOKです。
あとはDriverの接続プロパティで以下を指定して、接続することでOAuth 2.0による認証で接続が可能です。
プロパティ名 | 値 | 備考 |
---|---|---|
AuthScheme | OAuth | 認証方式を指定します。OAuthを指定してください。 |
InitiateOAuth | GETANDREFRESH | アクセストークンの取得方式を指定します。 |
OAuthClientId | 例)36e36b2d-84a6-4d60-380d-bb584e628456 | 登録したアプリのクライアントIDを指定します。 |
OAuthClientSecret | 例)3um.EOrL.6XAo~51blG7.bpT3hQjN5i2tf | アプリで生成したクライアントシークレットを指定します。 |
URL | 例)https://XXXXX.crm7.dynamics.com/ | 接続先となる Dynamics CRMのテナントURLを指定します。 |
CRM Version | CRM Online | クラウド版に接続する場合はCRM Onlineを指定します。 |