Azure VMにExchange Online環境とサービス/ daemin(インタラクティブユーザーなし)アプリケーションがあります。サービスはEWSマネージAPIを使用して、anyテナントユーザーのメールボックス内の電子メールを処理します。現在、EWSクライアントは基本認証を使用しています。Microsoftによると、Exchange OnlineへのアクセスはEWSでサポートされなくなります。
したがって、サービス/デーモンアプリケーションがEWSマネージAPIで使用するための有効なアクセストークンを取得する方法を見つける必要があります。
次の 記事 は、EWSマネージAPIでOAuth 2.0を使用する例を示しています。この例は機能しますが、同意を取得するインタラクティブな方法を使用します(サインインフォームはユーザーが自分自身を認証し、要求された権限をアプリケーションに付与します)。これは、インタラクティブなユーザーがいないため、サービス/デーモンアプリのシナリオには適していません。
サービス/デーモンアプリケーションの場合、client credential
認証フローを使用する必要があります。
https://aad.portal.Azure.com ポータルで管理者アカウントを使用するアプリケーションをAzure Active Directoryに登録しました。登録済みアプリケーションのクライアントシークレットを追加しました。
前述の article は、https://Outlook.office.com/EWS.AccessAsUser.All
をscope
として使用します。しかし、私はポータルでそのようなURLの許可を見つけられませんでした。 Office 365 Exchange Online
> Application permissions
> Mail
で次の権限のみが見つかりました:
https://Outlook.office365.com/Mail.Read
サインインしたユーザーなしで、アプリがすべてのメールボックスのメールを読み取ることを許可しますhttps://Outlook.office365.com/Mail.ReadWrite
サインインしているユーザーなしで、アプリがすべてのメールボックスのメールを作成、読み取り、更新、削除できるようにします。両方を追加して、すべてのユーザーに管理者の同意を与えました。
テストと簡単のため、認証ライブラリ(ADAL、MSALなど)は使用しませんでした。 Postmanを使用してアクセストークンを取得し、デバッグでtoken
変数を設定しました(後のコードスニペットを参照)。
さまざまなエンドポイントでアクセストークンを取得しようとしました。
POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token
grant_type=client_credentials
client_id=***
client_secret=***
scope=https://Outlook.office.com/EWS.AccessAsUser.All
この要求を送信すると、次のエラー応答が生成されます。
AADSTS70011:提供されるリクエストには、「スコープ」入力パラメーターを含める必要があります。入力パラメーター 'scope'に指定された値は無効です。スコープ https://Outlook.office.com/EWS.AccessAsUser.All は無効です。
scope
をhttps://Outlook.office.com/.default
に変更してみました。アクセストークンが返されましたが、EWSには無効のようです。 EWSクライアントはx-ms-diagnostics
応答ヘッダーの次の値で401エラーをスローします:
2000008; reason = "トークンに権限が含まれていないか、権限を理解できません。"; error_category = "invalid_grant"
POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/token
grant_type=client_credentials
client_id=***
client_secret=***
resource=https://Outlook.office.com
アクセストークンが返されましたが、EWSには無効のようです。 EWSクライアントは、#1で説明したように、x-ms-diagnostics
応答ヘッダーの値が同じ401エラーをスローします。
以下は、Postmanで取得したアクセストークンを使用してEWSクライアントをテストするために使用したコードサンプルです。
var token = "...";
var client = new ExchangeService
{
Url = new Uri("https://Outlook.office365.com/EWS/Exchange.asmx"),
Credentials = new OAuthCredentials(token),
ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress,
"[email protected]"),
};
var folder = Folder.Bind(client, WellKnownFolderName.SentItems);
OAuth 2.0クライアント資格情報フロー のMicrosoft公式ドキュメントに従っているときに同じ問題が発生しました
Microsoft IDプラットフォームとOAuth 2.0クライアント資格情報フロー )によると、スコープは「リソース識別子(必要なリソースの.defaultサフィックスが付加されたアプリケーションID URI)( デフォルトスコープドキュメント を参照)。
したがって、問題は、https://Outlook.office.com/EWS.AccessAsUser.All
をリソース識別子に変換する方法です。
実験的に、私はscope=https://Outlook.office365.com/.default
を使用してそれを機能させることができました。 full_access_as_app
(Office 365 Exchange Online /アプリケーションのアクセス許可)を付与し、 管理者の同意を得た 。
OAuthを実装しているときにこの問題に直面しました。私のアプリケーションはnotEWSマネージAPI を使用しています。
Office 365 Exchange Online > full_access_as_app
を追加しました。https://Outlook.office365.com/.default
のアクセストークンを取得しました。POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
form-data = {
client_id,
client_secret,
grant_type: 'client_credentials',
scope: 'https://Outlook.office365.com/.default',
};
Authorization
ヘッダーおよびExchangeImpersonation
SOAPヘッダーとしてリクエストにアクセストークンを追加しました。<SOAP-ENV:Header>
<t:ExchangeImpersonation>
<t:ConnectingSID>
<t:PrimarySmtpAddress>[email protected]</t:PrimarySmtpAddress>
</t:ConnectingSID>
</t:ExchangeImpersonation>
</SOAP-ENV:Header>