Я хочу разрешить пользователю изменять атрибуты своего профиля, такие как страна, город, адрес электронной почты и т. Д., Из моего приложения с помощью API-интерфейса Azure AD Graph.В настоящее время используется следующий код
IUser CurrentUser = await activeDirectoryClient.Me.ExecuteAsync();
CurrentUser.City = "SomeCity";
await CurrentUser.UpdateAsync();
Этот код вызывает исключение "Недостаточно прав для завершения операции".Но я разрешил все разрешения API Azure AD и Graph API, как показано на изображении ниже
Startup.Auth.cs Code для аутентификации пользователя:
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = Authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
// If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
AuthorizationCodeReceived = async (context) =>
{
var code = context.Code;
//After token download, Set the token download flag
HttpContext.Current.Session["NewTokenDownloadFlag"] = true;
ClientCredential credential = new ClientCredential(clientId, appKey);
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(System.IdentityModel.Claims.ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
AuthenticationResult authenticationResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);
}
}
});
Код для получения токена доступа:
public async Task<string> GetTokenForApplication()
{
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
// get a token for the Graph without triggering any user interaction (from the cache, via multi-resource refresh token, etc)
ClientCredential clientcred = new ClientCredential(clientId, appKey);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's database
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID, new ADALTokenCache(signedInUserID));
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenSilentAsync(graphResourceID, clientcred, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
return authenticationResult.AccessToken;
}
Примечание. Если назначить «Роль администрирования пользователя» из ролей Каталога, то этот код работает, и пользователь может обновить свой профиль, но эта роль активирована.ему / ей, чтобы изменить профиль любого другого пользователя, что я не хочу позволять.Буду признателен за любую помощь.
Примечание: для смены пароля я использую следующий код, и этот код работает нормально с теми же разрешениями.
await activeDirectoryClient.Me.ChangePasswordAsync("Old_Pwd", "New_Pwd");