Невозможно установить области с помощью EnableTokenAcquisitionToCallDownstreamApi с помощью AddMicrosoftIdentityWebApiAuthentication

#asp.net-core #microsoft-graph-api #asp.net-identity #microsoft-graph-sdks #microsoft-identity-platform

#asp.net-core #microsoft-graph-api #asp.net-identity #microsoft-graph-sdks #microsoft-identity-platform

Вопрос:

Это компилируется в startup.cs :

 string[] initialScopes = Configuration.GetValue<string>("GraphApi:Scopes")?.Split(' ');

services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
                .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
                .AddMicrosoftGraph();

  

Однако, поскольку я работаю только с контроллером API, а не с веб-приложением, я хочу сделать это вместо этого:

 string[] initialScopes = Configuration.GetValue<string>("GraphApi:Scopes")?.Split(' ');

services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
                .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
                .AddMicrosoftGraph();

  

Однако это не компилируется. По крайней мере, не с Microsoft.Identity.Web версией v1.0. Intellisense говорит мне об этом string[] is not assignable to parameter type ConfidentialClientApplicationOptions .

Разница в том, что AddMicrosoftIdentityWebApiAuthentication возвращает a MicrosoftIdentityWebApiAuthenticationBuilder , тогда как первый возвращает `MicrosoftIdentityAppCallsWebApiAuthenticationBuilder.

Есть ли здесь обходной путь?

Чего я пытаюсь добиться, так это убедиться, что область установлена правильно при запросе токена доступа к графу. В настоящее время, похоже, это не так, поскольку я получаю такую ошибку при попытке вызвать график — например await graphServiceClient.Applications.Request().GetAsync(); .

 ---> Microsoft.Identity.Web.MicrosoftIdentityWebChallengeUserException: IDW10502: An MsalUiRequiredException was thrown due to a challenge for the user. See https://aka.ms/ms-id-web/ca_incremental-consent. 
 ---> MSAL.NetCore.4.18.0.0.MsalUiRequiredException: 
    ErrorCode: user_null
Microsoft.Identity.Client.MsalUiRequiredException: No account or login hint was 
  

Другими словами, мне нужен токен доступа к приложению, который выглядит следующим образом:

 [...more json]
{
  "aud": "https://graph.microsoft.com",
  "iss": "https://sts.windows.net/{tenant id}/",
  "iat": 1602055659,
  "nbf": 1602055659,
  "exp": 1602059559,
  "aio": "[...]",
  "app_displayname": "My app",
  "appid": "{App id guid}",
  "appidacr": "1",
  "idp": "https://sts.windows.net/{tenant id}/",
  "idtyp": "app",
  "oid": "{guid}",
  "rh": "[...]",
  "roles": [
    "Application.ReadWrite.All",
    "Directory.ReadWrite.All",
    "Directory.Read.All",
    "Application.Read.All"
  ],
  "sub": "{guid}",
  "tenant_region_scope": "EU",
  "tid": "{tenant id}",
  "uti": "[...]",
  "ver": "1.0",
  "xms_tcdt": 1597308440
}.[Signature]
  

Я могу сгенерировать вышеуказанное вручную с помощью Postman, и если я использую его, он работает. Подтверждение правильности конфигурации приложения в Azure AD.

Ответ №1:

По-видимому, использование токена доступа к приложению в настоящее время еще не поддерживается.

IDW10502: исключение MsalUiRequiredException было вызвано из-за проблемы для пользователя #667

Ответ №2:

использовать

 .AddMicrosoftGraph(Configuration.GetSection("GraphAPI"))
  

и убедитесь, что ваш appsettings.json содержит следующее (используйте область, которую вы хотите разделить пробелом):

   "GraphAPI": {
    "BaseUrl": "https://graph.microsoft.com/v1.0",
    "Scopes": "user.read mail.read",
    "DefaultScope": "https://graph.microsoft.com/.default"
  }