Майкрософт.Identity.Web.MicrosoftGraph, AddMicrosoftGraph не вводит GraphServiceClient, который должным образом аутентифицирован

#microsoft-graph-api #asp.net-identity #blazor-webassembly #microsoft-graph-sdks #microsoft-identity-web

Вопрос:

У меня есть клиентское приложение Blazor WASM, которое пытается вызвать веб-api aspnet. С помощью веб-API я пытаюсь использовать Microsoft Graph SDK с делегированными разрешениями.

На сервере, когда я извлекаю экземпляр GraphServiceClient с помощью внедрения зависимостей, я получаю следующую ошибку при попытке прочитать пользовательские данные.

 var me = await graph.Me.Request().GetAsync();  StatusCode: 400   ResponseBody: {  "error":"invalid_grant",  "error_description":"AADSTS70000: The request was denied because one or more scopes requested are unauthorized or expired. The user must first sign in and grant the client application access to the requested scope.",  "error_codes":[70000],  "error_uri":"https://login.microsoftonline.com/error?code=70000",  "suberror":"consent_required",  (some data omitted)  }    

Однако, если я получу токен вручную ITokenAcquisition , все будет работать правильно.

 var token = await tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "User.Read" });  GraphServiceClient graph = new GraphServiceClient(new DelegateAuthenticationProvider(request =gt; {  request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);  return Task.CompletedTask; })); var me = await graph.Me.Request().GetAsync();    

У меня сложилось впечатление, что внедренный GraphServiceClient получит токены с помощью запроса IToken и передаст области, указанные при запуске.

Я что-то неправильно настраиваю? Похоже, что токен, используемый в внедренном клиенте, не содержит соответствующих областей.

Я попытался полностью выйти из своей учетной записи Microsoft и удалить кэш браузера. Я дал согласие на все необходимые разрешения.

Мой запуск сервера api выглядит так.

 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)  .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))  .EnableTokenAcquisitionToCallDownstreamApi()  .AddMicrosoftGraph(builder.Configuration.GetSection("GraphAPI"))  .AddInMemoryTokenCaches();  

серверные настройки приложений.json

 "AzureAd": {  "Instance": "https://login.microsoftonline.com/",  "TenantId": "consumers",  "ClientId": "{clientId}",  "ClientSecret": "{clientSecret}",  "Scopes": "AccessAsUser",  "CallbackPath": "/signin-oidc"  },  "GraphAPI": {  "BaseUrl": "https://graph.microsoft.com/v1.0",  "Scopes": "User.Read"  },  

Запуск клиента

 builder.Services.AddMsalAuthentication(options =gt; {  builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);  options.ProviderOptions.LoginMode = "redirect";  options.ProviderOptions.DefaultAccessTokenScopes.Add("api://{clientId}/.default");  options.ProviderOptions.DefaultAccessTokenScopes.Add("profile");  options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");  });  

клиентские приложения.json

 "AzureAd": {  "Authority": "https://login.microsoftonline.com/consumers",  "ClientId": "{clientId}",  "ValidateAuthority": true  }  

Ответ №1:

Что произойдет, если вы попытаетесь:

 var me = await graph.Me.Request().WithScopes("https://graph.microsoft.com/.default").GetAsync();  

Используя введенный экземпляр GraphServiceClient?