Office365のアカウントパスワードを忘れる社員が多いので、なんとか自動化したいなと思い、以下のようなフローでパスワードリセットを行なう仕組みを考えた。
Microsoft Graphを使用してユーザーのパスワードを強制的に再設定するには、下記のように、PasswordProfileを使用する必要がある。Microsoft Graph APIの.ChangePassword()メソッドを使用するには、旧パスワードが必須なため旧パスワードが分からないと、変更できないので・・・
using Microsoft.Graph;
using Azure.Identity;
・・・
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var cred = new UsernamePasswordCredential(AdminUsername,AdminPassword,TenantId,ServiceId,options);
// scopeにはUser.ReadWrite.All,Directory.ReadWrite.Allが必要
var graphClient = new GraphServiceClient(cred,scopes);
// テンポラリパスワードの生成
string newPassword = GeneratePassword();
// パスワードの変更
try {
User user = new User();
user.PasswordProfile = new PasswordProfile() {
ForceChangePasswordNextSignIn = true, // 次のログイン時にパスワード強制変更
ForceChangePasswordNextSignInWithMfa = false,
Password = newPassword // テンポラリパスワード
};
// パスワード情報の更新
await graphClient.Users[targetaccount]
.Request()
.UpdateAsync(user);
} catch (Exception e) {
Message = $"パスワードリセットに失敗しました。<br/>{e.Message}";
return;
}
ちなみに、HTTPメソッドはUpdateAsync()=PATCHを使用する。
備忘録として。
Microsoft Graph APIの仕様がかなり変更されたようで、nugetで取得できる最新版(5.17.0)では、以下のような形になります。
var request = new User() {
PasswordProfile = new PasswordProfile() {
Password = NewPassword,
ForceChangePasswordNextSignIn = false,
ForceChangePasswordNextSignInWithMfa = false
}
};
await graphClient.Users[TargetUser].PatchAsync(request);