3
Help us understand the problem. What are the problem?

posted at

Power Virtual Agents と Power Automate でユーザーのパスワードリセットするチャットボット作成【情シスボットシリーズ①】

はじめに

情シス向けチャットボット第一弾ということで、指定したユーザーのパスワードをリセットチャットボットを構築しました。
AADにはセルフサービスパスワードリセット機能がありますが、各ユーザーでID/パスワード以外の認証情報の登録が必要なため、導入が難しい組織も存在すると思います。

本チャットボットにより、情シスさんの問い合わせ内容で最も多いであろう「パスワード忘れました!」の対応を効率化できたらと思います。

Graph API のアクセス許可について

Power Automateで委任されたアクセス許可を利用する

当機能ではGraph APIを利用します。

Graph APIへのアクセスは、

  • アプリケーションの許可 
  • 委任されたアクセス許可
    があります。
    image.png

Power Automate からの利用は、アプリケーション自体にAPIのアクセス許可を与える「アプリケーションの許可」が便利ですが、Graph APIによっては、
アプリケーションの許可が不可なAPIが存在します

今回利用するAPIもこのパターンですから、ユーザーの代理で実行するのに必要なトークンの発行方法を記載します。

利用するOAuth 2.0 認証方法について

また、フロー(と説明)の簡略化のため、Graph PAI 認証には、 OAuth 2.0 リソース所有者のパスワード資格情報 (ROPC) 付与 を利用します。
この認証方式は、API利用者の資格情報をIDPに送信し、トークンを受信します。
よって、アプリケーション(Power Automate)にユーザーのパスワードを保持する必要があります。また、多要素認証(MFA)によるログインには対応していません。

より安全な方法で構築する場合は、他の方式「OAuth 2.0 認証コードの付与フロー」でアクセストークンを取得してください。

注意

プレミアムコネクタを利用します。有料ライセンスが必要です。
運用環境での使用は許可されていませんが、開発向けプランや開発者テナントであれば無償でお試しいただけます。

開発者向けプラン
Microsoft 365 開発者テナント

構築

実際の作成手順です

1.Azure AD アプリケーション登録

passwordAuthenticationMethod: resetPasswordを利用します。

このAPIは、「アプリケーションの許可」が存在しないため、委任されたアクセス許可を利用します。

1-1.アプリケーション登録

image.png

「UserAuthenticationMethod.ReadWrite.All」の権限を持った Azure AD アプリを作成します。

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

https://portal.azure.com/ に管理者権限でログインし、[アプリの登録]-[新規作成]

image.png

任意の名前を入力、アカウントの種類を追加。
対象がテナントユーザーであれば、「この組織ディレクトリにのみ含まれるアカウント」で問題ありません。

1-2.APIアクセス許可設定

image.png

[APIのアクセス許可]-[アクセス許可の追加]

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

[Microsoft Graph]を選択

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

[委任されたアクセス許可]-[{UserAuthenticationMethod.ReadWrite.Allで検索し}]-[UserAuthenticationMethod.ReadWrite.Allをチェックし]-[アクセス許可の追加]

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

追加したアクセス許可に管理の同意を与えます。

1-3.クライアントシークレット追加

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

クライアントシークレットを追加します。

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

クライアントシークレットの有効期限は、以前「無制限」が存在していましたが、今は最長24ヶ月です。
ただし、Powershellからの追加であれば設定可能です。
https://jpazureid.github.io/blog/azure-active-directory/azuread-clientsecrets-202104/

{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png

シークレットの値をコピーしておきます。

この画面から遷移してしまうと、シークレットの値は再表示できなくなります。

2.チャットボット作成

2-1.トピック作成

続いて、パスワードリセットのチャットボットを作成します。
トピックで、パスワードリセット対象UPNを問い合わせする質問を作成し保存します。

image.png

image.png

フローの作成し、

image.png

Power Virtual Agents フローテンプレートを選択します。

2-2.Power Autoamte Inputパラメータ設定

image.png

Power Virtual Agents からの引数は、パスワードリセット対象の userPrincipalName です。

2-3.アクセストークン取得

OAuth 2.0 リソース所有者のパスワード資格情報 (ROPC) 付与 を利用し、アクセストークンを取得します。

image.png

HTTPアクションを選択し、

image.png

方法

POST

URI

https://login.microsoftonline.com/{ディレクトリ(テナント)ID}/oauth2/token

ヘッダー

Content-Type : application/x-www-form-urlencoded

本文

grant_type=password
&resource=https://graph.microsoft.com
&client_id={アプリケーション(クライアント)ID}
&username={管理者のUPN}
&password={管理者のパスワード}
&client_secret={クライアントシークレットID}

passwordAuthenticationMethod: resetPasswordには下記ロールが必要とありますが、「ユーザー管理者」でも可能と思われます(検証はしていません)

  • グローバル管理者
  • 特権認証管理者
  • 認証管理者

以下のロールですと、グローバル管理者や同等の管理権限を持つユーザーのパスワードリセットは不可のため、ご注意ください。

  • パスワード管理者
  • ヘルプデスク管理者

2-4.passwordAuthenticationMethodオブジェクト取得

ユーザーのpasswordAuthenticationMethodを取得します。Graph Apiの仕様は下記をご覧ください。
https://docs.microsoft.com/ja-jp/graph/api/passwordauthenticationmethod-get?view=graph-rest-beta&tabs=http

ユーザーのパスワードを表します。 セキュリティのために、パスワード自体はオブジェクトに返されませんが、パスワードをリセットするアクションを実行できます。
https://docs.microsoft.com/ja-jp/graph/api/resources/passwordauthenticationmethod?view=graph-rest-beta

image.png

方法

GET

URI

https://graph.microsoft.com/beta/users/{userPrincipalName}/authentication/passwordMethods

ヘッダー

Authorization : Bearer @{body('HPPT')?['access_token']}
Content-type : application/json

@{body('HPPT')?['access_token']} 
の部分は「JSONの解析」機能で動的コンテンツを取得し、埋め込んでもOKです

2-5.resetPassword実行

image.png

方法

POST

URI

https://graph.microsoft.com/beta/users/{userPrincipalName}/authentication/passwordMethods/@{body('HTTP2')?['value']?[0]?['id']}/resetPassword

@{body('HTTP2')?['value']?[0]?['id']}
の部分は上記で取得した、passwordAuthenticationMethodオブジェクトです
「JSONの解析」機能で動的コンテンツを取得し、埋め込んでもOKです

ヘッダー

Authorization : Bearer @{body('HPPT')?['access_token']}
Content-type : application/json

本文

{
  "newPassword": "{変更するパスワード}"
}

当処理でパスワードリセットすると、ユーザーは初回ログイン時にパスワード変更を要求されます。
よって、上記で指定する{変更するパスワード}は一時的な値です。
管理者は、ユーザーにこの値を伝えます。

2-6.Power Autoamte Inputパラメータ設定

image.png

パスワードリセット完了旨のメッセージを、チャットボットに返します。
対象ユーザーや、リセット後のパスワードを表示すると便利だと思います。

2-7.トピックからフローの呼び出し

image.png

作成したフローをチャットボットから呼び出し、パラメータを設定します。
InputとOutputを設定します。

まとめ

情シス用ボット第1弾として、指定ユーザーのパスワードリセットボットを作成しました。

上記で記載しましたが、本記事で利用したOAuth 2.0 認証方法よりもセキュアな方法も可能です。
その方法は、別記事にて記載いたします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?