首页 > 解决方案 > 无法重置没有特定角色的登录用户的密码

问题描述

我有一个在 Azure Functions 中运行的 C# 应用程序,我需要使用用户名\密码凭据更改特定用户的密码。

我的应用程序使用 MSAL 进行身份验证 ( https://github.com/AzureAD/microsoft-authentication-library-for-dotnet )

为了获得使用用户名\密码流进行身份验证的能力,使用此选项:https ://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Username-Password-Authentication 。

我正在使用 Graph API 来更改用户的密码(https://docs.microsoft.com/en-us/graph/api/user-update?view=graph-rest-1.0&tabs=http

仅当我授予用户以下内置分配角色之一时,我才设法以这种方式重置密码:

密码管理员、帮助台管理员、身份验证管理员、用户管理员、特权身份验证管理员、全局管理员

但是如果我不给用户一个这些角色,它会在尝试使用 PATCH 请求更新用户时收到以下错误消息https://graph.microsoft.com/v1.0/users/####### #-####-####-####-########

消息:{“错误”:{“代码”:“Authorization_RequestDenied”,“消息”:“权限不足,无法完成操作。”,“innerError”:{“日期”:“2021-04-07T12:56:56” , "request-id": "########-#####-#####-#####-#####", "client-request-id": "########-####-####-####-########" } } }

我的问题是我不想将这些权限授予任何用户只是为了更改自己的密码,因为这些角色太强大了。

对我来说,用户无法使用该流程更改自己的密码是没有意义的,因为使用 PowerShell,例如,Update-AzureADSignedInUserPassword用户可以使用并且不需要特殊角色。为什么当我尝试对我的流程执行相同的操作时角色会影响它。任何想法如何克服这个问题,我做错了什么,或者在那个流程中甚至可能吗?

提前谢谢

标签: c#.netazureazure-active-directorymsal

解决方案


尝试使用changePassword端点应该满足您的要求。您无需授予用户任何管理员角色。

POST https://graph.microsoft.com/v1.0/me/changePassword
Content-Type: application/json
{
  "currentPassword": "Test1234!",
  "newPassword": "Test5678!"
}

在此处输入图像描述


GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var currentPassword = "{currentPassword}";

var newPassword = "{newPassword}";

await graphClient.Me
    .ChangePassword(currentPassword,newPassword)
    .Request()
    .PostAsync();

推荐阅读