CData Software Blog

クラウド連携のCData Software の技術ブログです。

Dynamics CRM(365)Driver で「Ws-Trust authentication」のエラーが表示された場合の対処方法

f:id:sugimomoto:20201215214441p:plain

こんにちは。CData Software Japan リードエンジニアの杉本です。

前々からアナウンスが出ていましたが、Dynamics 365 / CRMCDS・Dataverse)の Organization Service(いわゆるSOAP API) 認証手段の一つである、 WS-Trust 認証セキュリティ プロトコルが非推奨、というか廃止になりました。

docs.microsoft.com

それでも、なんだかんだで最近まで利用できていたのかな? と感じていたんですが、私が試している環境で正式なエラーをキャッチしました。

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のはずです。)

f:id:sugimomoto:20201215214446p:plain

実際のレスポンス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 です。

www.cdata.com

基本的にはエラーメッセージに書いてあるとおりで、「Ws-Trustはサポートしなくなったので、OAuth 2.0 Authenticationでアクセスしてね」ということで、この記事の大半は終わりですが、少し詳細と対処方法についてこの記事で紹介していきたいと思います。

そもそも Dynamics 365に接続するにあたり Ws-Trust authentication とは何をしていたのか?

詳細情報は Ws-Trust 公式リファレンスは下記を漁っていただくとして

docs.oasis-open.org

docs.microsoft.com

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による接続アプローチはありますが、おそらく明示的に利用を促しているものがほとんどです。

kageura.hatenadiary.jp

対処方法

前述の通り、OAuth 2.0を利用した接続に切り替える必要があります。

公式SDKを通じた対処方法は下記URLを参照してみてください。

docs.microsoft.com

続いてDynamics CRM Driverでの対処方法ですが

ここで注意していただきたいのは、Dynamics CRM Driver が利用しているSOAP API(Organization Service API)はすでに非推奨・将来的な廃止を予定しているということです。

docs.microsoft.com

そのため、基本的には最新のWeb APIを利用している以下の Dynamics 365 Sales Driverを利用しましょう。

こちらは標準でOAuth 2.0 の認証が使用されます。

www.cdata.com

f:id:sugimomoto:20201215214457p:plain

どうしても、Dynamics CRM DriverでSOAP接続が行いたい! という場合には、OAuthアプリを自分で作成・登録し、接続することが可能になっています。

Dynamics CRM Driver で OAuth 2.0 による接続を行う方法

まず対象のテナントのAzure Adにアクセスし、アプリを新規登録します。

f:id:sugimomoto:20201215214509p:plain

任意の名称を付与して

「任意の組織ディレクトリ内のアカウント(任意のAzure AD ディレクトリ-マルチテナント)」を指定

リダイレクトURIは「Web」の「http://localhost:33333」を指定します。もしクライアントアプリ以外の場合は、任意のURIを指定してください。

f:id:sugimomoto:20201215214518p:plain

次に、APIのアクセス許可から、Dynamics CRMを選択し

f:id:sugimomoto:20201215214524p:plain

「委任されたアクセス許可」にある「user_impersonation」を付与します。

f:id:sugimomoto:20201215214554p:plain

あとは、クライアントシークレットを作成し

f:id:sugimomoto:20201215214601p:plain

概要に存在するクライアントIDを取得すればOKです。

f:id:sugimomoto:20201215214612p:plain

あとは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を指定します。