密码重置权限不足

时间:2017-06-01 17:37:45

标签: microsoft-graph

我的目标是允许用户在我的应用程序中更改和重置自己的密码。我们不希望用户被重定向到同意页面。

我按照说明defined here

但是我遇到了以下错误:

let newTime: Double = Double(totalDifference)
let notifTrigger = UNTimeIntervalNotificationTrigger(timeInterval: newTime, repeats: false)
let request = UNNotificationRequest(identifier: "openApp", content: notif, trigger: notifTrigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
    if error != nil {
        print(error!)
        completion(false)
    } else {
        completion(true)
    }
})

我的补丁请求:

{
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "19c43c69-f553-470e-9432-617395f5f8f5",
      "date": "2017-06-01T17:24:11"
    }
  }
}

这是我的图表权限:

委派权限:

PATCH /v1.0/users/2b6c3114-d81b-429d-af7e-c822a456ebba HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer eyJ0eXAiOiJKV1QiLCJ...xnsYVw Content-Type: application/json Cache-Control: no-cache Postman-Token: 73f...d6 { "passwordProfile": { "password": "w", "forceChangePasswordNextSignIn": false } } User.ReadUser.ReadWrite *,Directory.AccessAsUser.All *,Directory.ReadWrite.All *

申请权限:

User.ReadWrite.All *,Directory.ReadWriteAll *,User.Read.All *

*需要管理员同意

我了解使用User.ReadWrite.All属性时需要范围Directory.AccessAsUser.All。由于这不作为应用程序权限提供,这是否意味着我必须代表用户访问并使用授权代码授权?在使用授权码检索令牌时,我没有看到任何可能的方法来避免用户同意。

编辑1

我尝试使用client_credentials grant_type获取令牌,但如果我不使用passwordProfile范围,我总会收到一条消息,指出范围无效:

https://graph.microsoft.com/.default

2 个答案:

答案 0 :(得分:2)

因此,我可以通过以下事实来回答这个问题,即可能有充分的理由去做你正在做的事情,但是你应该通过绕过Azure AD登录和相关功能来了解组织将失去的所有事情。 SSPR。请参阅此excellent blog post,其中介绍了您将丢失的一些内容 - 此外,这仍然相关,现在您的客户将失去更多安全功能,例如条件访问。

无论如何,假设你要提前...... 对于您的场景(绕过Azure AD SSPR和更改密码体验的应用程序服务),有一个更改密码选项(看起来我们没有记录 - 为此提交了一个错误),遗憾的是我没有提供密码重置的任何内容。让我谈谈第一个。

  1. 更改密码 - 在Microsoft Graph中(虽然没有记录),您可以在用户上找到“changePassword”方法 - ../users/{id}/changePassword,它使用旧密码和新密码。此API仅适用于已登录的用户(因此需要委派的OAuth2代码流)。它需要管理员同意Directory.AccessAsUser.All(尽管我们正在考虑添加更细化的权限)。

  2. 重置密码 - Microsoft Graph没有为此公开仅限应用程序的权限。这是授予应用程序的极其强大的权限。您已经通过支持获得了解决方法,以便管理员使用powershell明确授予此权限。这会为您的应用授予客户资源的许多权限。或者,有一个委派权限(Directory.AccessAsUser.All),允许管理员用户重置另一个用户的密码。然而,这不是一种自助服务体验。

  3. 希望这有帮助,

答案 1 :(得分:1)

我在与微软交谈后解决了这个问题。

原来,应用注册需要分配给他们的角色。

  1. 安装Azure AD模块 - https://docs.microsoft.com/en-us/powershell/msonline/
  2. 打开一个 “适用于Windows PowerShell的Microsoft Azure Active Directory模块” 命令提示符:
  3. $AADCreds = Get-Credential // You will be prompted for your credentials
    Import-Module MSOnline Connect-MsolService -Credential $AADCreds Get-MsolServicePrincipal -AppPrincipalId "" // Note: Copy the ObjectId for your Service Principal
    Add-MsolRoleMember -RoleName "" -RoleMemberObjectId -RoleMemberType ServicePrincipal
    

    我使用“用户帐户管理员”作为目录角色。