👌

Company Communicator v5.3 でメッセージ配信者をセキュリティグループで管理したい

2022/12/30に公開

.NET 6 対応した Company Communicator v5.3 が先日リリースされました。手持ちの環境をアップデートしたときの記事は以下になります。

https://zenn.dev/okazuki/articles/update-cc-to53

この Company Communicator は、Teams アプリで全社員に対してメッセージを配信したり、特定のチームに所属している人に対してメッセージを配信したりと社内の広報的なことをやる人にとって、とっても便利なアプリです。

デフォルトの Company Communicator では、メッセージを配信するアプリを開けるユーザーのメールアドレスを App Service のアプリケーション設定の AuthorizedCreatorUpns にセミコロン区切りで設定する必要があります。ちょっとしたユーザーの管理ならこれでもいいのですが、そこそこの頻度で配信する人が変わったり、人数がそれなりにいるとちょっと大変です…。

そんな時は Azure AD のセキュリティグループなどでメッセージを配信可能なユーザーを絞れると便利そうだなぁということでカスタムしてみました。

https://github.com/runceel/microsoft-teams-apps-company-communicator-securitygroup

オリジナルではASP.NET Core のポリシーベースの承認の機能を使って UPN のチェックを行っています。具体的には MustBeValidUpnHandler クラスでその処理を行っています。

https://github.com/OfficeDev/microsoft-teams-apps-company-communicator/blob/main/Source/CompanyCommunicator/Authentication/MustBeValidUpnHandler.cs

ここの処理をカスタマイズして AuthorizedCreatorUpns に GUID が設定されていたら、その GUID のセキュリティグループのメンバーかどうかをチェックするようにクラスを変更してみました。セキュリティグループのメンバーかどうかの判定は Microsoft Graph API に checkMemberGroups という API があるので、これを使ってチェックしています。そして、毎回チェックするために Graph API を叩いていたら無駄なのでチェック結果は 15 分くらいメモリーキャッシュに保存するようにしています。Company Communicator は基本的に 1 インスタンス構成で運用されているのでメモリで十分ですね。

実際にカスタマイズしたハンドラーは以下のようになります。

https://github.com/runceel/microsoft-teams-apps-company-communicator-securitygroup/blob/main/Source/CompanyCommunicator/Authentication/MustBeValidUpnOrSecurityGroupHandler.cs

Startup.cs で MemoryCache も追加しています。

https://github.com/runceel/microsoft-teams-apps-company-communicator-securitygroup/blob/main/Source/CompanyCommunicator/Startup.cs#L152

その他にもクラス名を少し変更したりしているので細かな変更はしていますが、大きな変更はこれくらいです。

Microsoft (有志)

Discussion