首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >资源‘GUID值here’不存在或其查询的引用属性对象之一不存在

资源‘GUID值here’不存在或其查询的引用属性对象之一不存在
EN

Stack Overflow用户
提问于 2019-06-11 23:21:48
回答 1查看 1.6K关注 0票数 1

我正在尝试更改Azure AD用户密码。

用户已使用隐式流和adal库在SPA应用程序中进行身份验证。

在呼叫时:

代码语言:javascript
复制
return await graphClient.Me.Request().UpdateAsync(new User
                {
                    PasswordProfile = new PasswordProfile
                    {
                        Password = userPasswordModel.NewPassword,
                        ForceChangePasswordNextSignIn = false
                    },
                });

我得到了这个异常:

{“代码: Request_ResourceNotFound\r\nMessage:资源'35239a3d-67e3-4560-920a-2e9ce027aeab‘不存在或其查询的引用属性对象之一不存在。\r\n\r\n内部错误\r\n”}

调试我使用Microsoft Client SDK获得的访问令牌时,我看到这个GUID引用了oidsub属性。如下所示:

这是我用来获取令牌的代码:

代码语言:javascript
复制
 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 Graph包:

代码语言:javascript
复制
  <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为当前登录的用户获取令牌的推荐方式是什么?

你能说点什么吗?

#######编辑#######

我使用下面的代码取得了一些进展:

代码语言:javascript
复制
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;

但现在我得到了错误:

权限不足,无法完成操作。authorization_requestdenied

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 03:49:45

经过长时间的调试(8小时左右),在我看了@Michael Mainer的this answer之后,我终于能够得到我想要的东西了。

这是我放在一起的“正确”代码:

代码语言:javascript
复制
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;
    }
}

注意1:正在使用graphClient.Users[graphUser.ObjectId]而不是graphClient.Me

注2:.ToGraphUserAccount()来自Microsoft.Graph.Auth。

我在Postman中有一个示例PATCH请求,可以正确地为用户设置新密码。

Postman的Authorization请求报头中使用的访问令牌属性与我使用Microsoft Graph API获取的属性具有相同的格式\。我只是用jwt.io对它们进行了比较。所以我一定是打错电话了。

我改用了clientApp.AcquireTokenForClient

代码语言:javascript
复制
var authResult = await clientApp.AcquireTokenForClient(new[] { MSGraphScope }).ExecuteAsync();

return authResult.AccessToken;

其中:

代码语言:javascript
复制
MSGraphScope = "https://graph.microsoft.com/.default"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56546947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档