资源 'GUID value here' 不存在或其查询的引用之一 - 属性 对象不存在
Resource 'GUID value here' does not exist or one of its queried reference-property objects are not present
我正在尝试更改 Azure AD 用户密码。
用户已经在 SPA 应用程序中使用 隐式流 和 adal
库进行了身份验证。
通话时:
return await graphClient.Me.Request().UpdateAsync(new User
{
PasswordProfile = new PasswordProfile
{
Password = userPasswordModel.NewPassword,
ForceChangePasswordNextSignIn = false
},
});
我遇到了这个异常:
{"Code: Request_ResourceNotFound\r\nMessage: Resource
'35239a3d-67e3-4560-920a-2e9ce027aeab' does not exist or one of its
queried reference-property objects are not present.\r\n\r\nInner
error\r\n"}
调试我通过 Microsoft Client SDK
获得的访问令牌 我看到这个 GUID 指的是 oid
和 sub
属性。见下文:
这是我用来获取令牌的代码:
IConfidentialClientApplication clientApp =
ConfidentialClientApplicationBuilder.Create(Startup.clientId)
.WithAuthority(string.Format(AuthorityFormat, Startup.tenant))
.WithRedirectUri(Startup.redirectUri)
.WithClientSecret(Startup.clientSecret)
.Build();
var authResult = await clientApp.AcquireTokenForClient(new[] { MSGraphScope }).ExecuteAsync();
return authResult.AccessToken;
我在 SPA 应用程序中使用 隐式流 。在执行 ClaimsPrincipal.Current
时,我看到我的用户已通过身份验证并且所有声明都存在。
我已经阅读了很多文档@GitHub 和 Microsoft Docs,但我仍然不清楚如何实现它。
顺便说一下,我正在使用这些 Microsoft Graph 包:
<package id="Microsoft.Graph" version="1.15.0" targetFramework="net461" />
<package id="Microsoft.Graph.Auth" version="0.1.0-preview.2" targetFramework="net461" />
<package id="Microsoft.Graph.Core" version="1.15.0" targetFramework="net461" />
我想我没有接近这个正确性,因为我应该为用户获取令牌,而不是为应用程序获取令牌。我应该改用 clientApp.AcquireTokenOnBehalfOf
吗?
如果是这样,使用 Microsoft Graph API SDK 为当前登录的用户获取令牌的推荐方法是什么?
你能说点什么吗?
####### 编辑 #######
我使用这个取得了一些进展:
var bearerToken = ClaimsPrincipal.Current.Identities.First().BootstrapContext as string;
JwtSecurityToken jwtToken = new JwtSecurityToken(bearerToken);
var userAssertion = new UserAssertion(jwtToken.RawData, "urn:ietf:params:oauth:grant-type:jwt-bearer");
IEnumerable<string> requestedScopes = jwtToken.Audiences.Select(a => $"{a}/.default");
var authResult = clientApp.AcquireTokenOnBehalfOf(new[] { MSGraphScope }, userAssertion).ExecuteAsync().GetAwaiter().GetResult();
return authResult.AccessToken;
但现在我收到错误消息:
insufficient privileges to complete the operation.
authorization_requestdenied
经过长时间的调试(8 小时左右),在看到@Michael Mainer 的 之后,我终于得到了我想要的东西。
这是我整理的 "right" 代码:
public async Task<User> ChangeUserPassword(UserPasswordModel userPasswordModel)
{
try
{
var graphUser = ClaimsPrincipal.Current.ToGraphUserAccount();
var newUserInfo = new User()
{
PasswordProfile = new PasswordProfile
{
Password = userPasswordModel.NewPassword,
ForceChangePasswordNextSignIn = false
},
};
// Update the user...
return await graphClient.Users[graphUser.ObjectId].Request().UpdateAsync(newUserInfo);
}
catch(Exception e)
{
throw e;
}
}
Note 1: graphClient.Users[graphUser.ObjectId]
is being used instead of graphClient.Me
Note 2: .ToGraphUserAccount()
is from Microsoft.Graph.Auth.
我在 Postman 中有一个示例 PATCH
请求,它正确地为用户设置了新密码。
邮递员 Authorization
request-header 中使用的 访问令牌 与我通过 Microsoft Graph API。我只是使用 jwt.io 比较了它们。所以我一定是调用错了什么...
我用 clientApp.AcquireTokenForClient
代替:
var authResult = await clientApp.AcquireTokenForClient(new[] { MSGraphScope }).ExecuteAsync();
return authResult.AccessToken;
其中:
MSGraphScope = "https://graph.microsoft.com/.default"
我正在尝试更改 Azure AD 用户密码。
用户已经在 SPA 应用程序中使用 隐式流 和 adal
库进行了身份验证。
通话时:
return await graphClient.Me.Request().UpdateAsync(new User
{
PasswordProfile = new PasswordProfile
{
Password = userPasswordModel.NewPassword,
ForceChangePasswordNextSignIn = false
},
});
我遇到了这个异常:
{"Code: Request_ResourceNotFound\r\nMessage: Resource '35239a3d-67e3-4560-920a-2e9ce027aeab' does not exist or one of its queried reference-property objects are not present.\r\n\r\nInner error\r\n"}
调试我通过 Microsoft Client SDK
获得的访问令牌 我看到这个 GUID 指的是 oid
和 sub
属性。见下文:
这是我用来获取令牌的代码:
IConfidentialClientApplication clientApp =
ConfidentialClientApplicationBuilder.Create(Startup.clientId)
.WithAuthority(string.Format(AuthorityFormat, Startup.tenant))
.WithRedirectUri(Startup.redirectUri)
.WithClientSecret(Startup.clientSecret)
.Build();
var authResult = await clientApp.AcquireTokenForClient(new[] { MSGraphScope }).ExecuteAsync();
return authResult.AccessToken;
我在 SPA 应用程序中使用 隐式流 。在执行 ClaimsPrincipal.Current
时,我看到我的用户已通过身份验证并且所有声明都存在。
我已经阅读了很多文档@GitHub 和 Microsoft Docs,但我仍然不清楚如何实现它。 顺便说一下,我正在使用这些 Microsoft Graph 包:
<package id="Microsoft.Graph" version="1.15.0" targetFramework="net461" />
<package id="Microsoft.Graph.Auth" version="0.1.0-preview.2" targetFramework="net461" />
<package id="Microsoft.Graph.Core" version="1.15.0" targetFramework="net461" />
我想我没有接近这个正确性,因为我应该为用户获取令牌,而不是为应用程序获取令牌。我应该改用 clientApp.AcquireTokenOnBehalfOf
吗?
如果是这样,使用 Microsoft Graph API SDK 为当前登录的用户获取令牌的推荐方法是什么?
你能说点什么吗?
####### 编辑 #######
我使用这个取得了一些进展:
var bearerToken = ClaimsPrincipal.Current.Identities.First().BootstrapContext as string;
JwtSecurityToken jwtToken = new JwtSecurityToken(bearerToken);
var userAssertion = new UserAssertion(jwtToken.RawData, "urn:ietf:params:oauth:grant-type:jwt-bearer");
IEnumerable<string> requestedScopes = jwtToken.Audiences.Select(a => $"{a}/.default");
var authResult = clientApp.AcquireTokenOnBehalfOf(new[] { MSGraphScope }, userAssertion).ExecuteAsync().GetAwaiter().GetResult();
return authResult.AccessToken;
但现在我收到错误消息:
insufficient privileges to complete the operation. authorization_requestdenied
经过长时间的调试(8 小时左右),在看到@Michael Mainer 的
这是我整理的 "right" 代码:
public async Task<User> ChangeUserPassword(UserPasswordModel userPasswordModel)
{
try
{
var graphUser = ClaimsPrincipal.Current.ToGraphUserAccount();
var newUserInfo = new User()
{
PasswordProfile = new PasswordProfile
{
Password = userPasswordModel.NewPassword,
ForceChangePasswordNextSignIn = false
},
};
// Update the user...
return await graphClient.Users[graphUser.ObjectId].Request().UpdateAsync(newUserInfo);
}
catch(Exception e)
{
throw e;
}
}
Note 1:
graphClient.Users[graphUser.ObjectId]
is being used instead ofgraphClient.Me
Note 2:
.ToGraphUserAccount()
is from Microsoft.Graph.Auth.
我在 Postman 中有一个示例 PATCH
请求,它正确地为用户设置了新密码。
邮递员 Authorization
request-header 中使用的 访问令牌 与我通过 Microsoft Graph API。我只是使用 jwt.io 比较了它们。所以我一定是调用错了什么...
我用 clientApp.AcquireTokenForClient
代替:
var authResult = await clientApp.AcquireTokenForClient(new[] { MSGraphScope }).ExecuteAsync();
return authResult.AccessToken;
其中:
MSGraphScope = "https://graph.microsoft.com/.default"