【问题标题】:How to change a user password using Microsoft Graph API如何使用 Microsoft Graph API 更改用户密码
【发布时间】:2019-11-07 11:44:48
【问题描述】:

我正在编写一种passwd 命令行应用程序来更改 Azure 帐户的密码。像这样工作的东西:

> passwd someuser Passw*rd1

阅读完所有文档后,我在 Azure 门户中创建了具有所有所需权限的应用程序,并且在获取访问令牌之前,我即将获得应用程序授权。

问题是https://login.microsoftonline.com/<tenantName>/oauth2/v2.0/authorize 的调用返回给我的是一个 HTML 页面,而不是获取授权码。

据我了解,此页面应该让登录用户有机会委派所需的权限,但这是管理员用户使用的命令。事实上,此时没有登录用户。

我错过了什么?

【问题讨论】:

  • 问题是关于更改密码的问题,就像代码示例所示,所以文字与问题一致。有关获取访问令牌的详细信息只是为了澄清我被卡住的过程阶段。甚至想到,其他人能够足够仔细地阅读问题并发布我的问题的确切答案,这被接受了。

标签: azure-devops microsoft-graph-api azure-ad-graph-api


【解决方案1】:

有一个关于重置用户密码的代码示例。

$tennantid        = ''         
$SubscriptionId   = ''         
$ApplicationID    = ''         
$ApplicationKey   = ''
$TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $tennantid 
$ARMResource = "https://graph.microsoft.com";

$Body = @{
        'resource'= $ARMResource
        'client_id' = $ApplicationID
        'grant_type' = 'client_credentials'
        'client_secret' = $ApplicationKey
        'scope' = 'https%3A%2F%2Fgraph.microsoft.com%2FDirectory.AccessAsUser.All'
}

$params = @{
    ContentType = 'application/x-www-form-urlencoded'
    Headers = @{'accept'='application/json'}
    Body = $Body
    Method = 'Post'
    URI = $TokenEndpoint
}

$token = Invoke-RestMethod @params

$headers = @{}
$headers.Add("authorization","Bearer $($Token.access_token)")
$ResetPwd = @{
    "passwordProfile" = @{
        "forceChangePasswordNextSignIn" = "false"
        "password" = "Test123456!"
    }
} | ConvertTo-Json
Invoke-RestMethod -Headers $headers -Method Patch -Uri "https://graph.microsoft.com/beta/users/$($respons.id)" -ContentType "application/json" -Body $ResetPwd

然后使用这个,上面的代码就可以了。

$servicePrincipal = Get-MsolServicePrincipal -ServicePrincipalName ServicePrincipalName
$roleId = (Get-MsolRole -RoleName "Company Administrator").ObjectId
Add-MsolRoleMember -RoleObjectId $roleId -RoleMemberObjectId $servicePrincipal.ObjectId -RoleMemberType servicePrincipal

希望对您有所帮助。

【讨论】:

  • 这是正确的答案,因为我可以做我想做的事而无需授权
【解决方案2】:

您在哪里调用/authorize 端点?

您可以在浏览器中这样调用它并使用您的帐户登录:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&response_mode=query
&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&state=12345

然后您将在地址栏中获得一个“代码”。 使用此代码请求访问令牌:

POST /{tenant}/oauth2/v2.0/token HTTP/1.1

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&client_secret=JqQX2PNo9bpM0uEihUPzyrh

查看Request an authorization codeRequest an access token 的详细信息。

【讨论】:

  • 很抱歉花了一点时间才回来。不幸的是,您的回答仍然不能解决我的问题。当我发布您建议的第一个请求时,我得到的是一个 HTML 页面。此页面是凭据输入对话框的第一个页面,要求输入用户名和密码。但是,我想要的是一个无声的过程。我想以管理员身份工作,只需为某个用户设置他/她的密码,而无需公开登录 Azure。我有一个具有正确权限的管理用户来设置其他人的密码,所以我想使用这个用户作为隐式登录用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2018-01-16
  • 2018-08-29
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多