我的目标是允许用户在我的应用程序中更改和重置自己的密码。我们不希望用户被重定向到同意页面。
我按照说明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.Read
,User.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
答案 0 :(得分:2)
因此,我可以通过以下事实来回答这个问题,即可能有充分的理由去做你正在做的事情,但是你应该通过绕过Azure AD登录和相关功能来了解组织将失去的所有事情。 SSPR。请参阅此excellent blog post,其中介绍了您将丢失的一些内容 - 此外,这仍然相关,现在您的客户将失去更多安全功能,例如条件访问。
无论如何,假设你要提前...... 对于您的场景(绕过Azure AD SSPR和更改密码体验的应用程序服务),有一个更改密码选项(看起来我们没有记录 - 为此提交了一个错误),遗憾的是我没有提供密码重置的任何内容。让我谈谈第一个。
更改密码 - 在Microsoft Graph中(虽然没有记录),您可以在用户上找到“changePassword”方法 - ../users/{id}/changePassword,它使用旧密码和新密码。此API仅适用于已登录的用户(因此需要委派的OAuth2代码流)。它需要管理员同意Directory.AccessAsUser.All(尽管我们正在考虑添加更细化的权限)。
重置密码 - Microsoft Graph没有为此公开仅限应用程序的权限。这是授予应用程序的极其强大的权限。您已经通过支持获得了解决方法,以便管理员使用powershell明确授予此权限。这会为您的应用授予客户资源的许多权限。或者,有一个委派权限(Directory.AccessAsUser.All),允许管理员用户重置另一个用户的密码。然而,这不是一种自助服务体验。
希望这有帮助,
答案 1 :(得分:1)
我在与微软交谈后解决了这个问题。
原来,应用注册需要分配给他们的角色。
$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
我使用“用户帐户管理员”作为目录角色。