Я пытаюсь изменить пароль пользователя Azure AD.
Пользователь уже аутентифицирован в приложении SPA с использованием неявного потока 1006 * и библиотеки adal
.
Во время звонка:
return await graphClient.Me.Request().UpdateAsync(new User
{
PasswordProfile = new PasswordProfile
{
Password = userPasswordModel.NewPassword,
ForceChangePasswordNextSignIn = false
},
});
Я получаю это исключение:
{"Код: Request_ResourceNotFound \ r \ nСообщение: Ресурс
'35239a3d-67e3-4560-920a-2e9ce027aeab' не существует или один из его
Запрошенные объекты ссылочных свойств отсутствуют. \ r \ n \ 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;
но теперь я получаю сообщение об ошибке:
недостаточно прав для завершения операции.
authorization_requestdenied