IDW10201: в токене-носителе не найдено ни утверждений области видимости, ни утверждений ролей. пользовательское ядро веб-api

#c# #asp.net-core #asp.net-web-api #azure-active-directory #msal

#c# #asp.net-core #asp.net-web-api #azure-active-directory #msal

Вопрос:

У меня есть регистрация приложения, подобная этой:

введите описание изображения здесь

В моем webappi my app settings.json: у меня есть это:

 {
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "xx.com.co",
    "TenantId": "xx-c220-48a2-a73f-1177fa2c098e",
    "ClientId": "xx-3737-48a5-a6c0-7e3bc4f9a5c9",
    "CallbackPath": "/signin-oidc",
    "Scopes" : "userimpersonation"

  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
 

В моем Startup.cs:

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
 

И в моем контроллере:

 [Authorize]
    [RequiredScope(RequiredScopesConfigurationKey = "AzureAd:Scopes")]
    [ApiController]
    [Route("api/[controller]")]
    public class WeatherForecastController : ControllerBase
    {
 

Итак, я запускаю веб-приложение и получаю токен через postman:

 curl --location --request POST 'https://login.microsoftonline.com/xx-c220-48a2-a73f-1177fa2c098e/oauth2/v2.0/token' 
--header 'Content-Type: application/x-www-form-urlencoded' 
--header 'Cookie: wlidperf=FR=Lamp;ST=1526512036088; fpc=AnqPVmkUS_BIgf3y-QfBcFEzTZcDBQAAAKAv0dcOAAAA; stsservicecookie=ests; x-ms-gateway-slice=prod' 
--form 'grant_type="client_credentials"' 
--form 'client_secret="xx"' 
--form 'client_id="xx-3737-48a5-a6c0-7e3bc4f9a5c9
"' 
--form 'scope="api://xx-3737-48a5-a6c0-7e3bc4f9a5c9/.default
"'
 

Это работает нормально, однако, если я перенаправлю область действия на: api://xx-3737-48a5-a6c0-7e3bc4f9a5c9/userimpersonation .

Затем я получаю эту ошибку:

 AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid
 

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

 System.UnauthorizedAccessException: IDW10201: Neither scope or roles claim was found in the bearer token. 
   at Microsoft.Identity.Web.MicrosoftIdentityWebApiAuthenticationBuilderExtensions.<>c__DisplayClass3_1.<<AddMicrosoftIdentityWebApiImplementation>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
 

Комментарии:

1. Вам нужно добавить approle .

2. см.: i.stack.imgur.com/InpBW.png

3. является ли роль приложения параметром для получения токена? Я уже добавил его при регистрации приложения, но не уверен, как его использовать

4. Перейдите в клиентское приложение> Разрешения API> Добавить разрешение> Мои API> ваше приложение api

5. Я сделаю это, как только это сработает, и я это понимаю 🙂

Ответ №1:

Вам необходимо создать два приложения, одно как клиентское приложение, а другое как приложение api. Затем вам нужно создать разрешение приложения api, а затем предоставить эту роль в качестве разрешения приложения для клиентского приложения.

введите описание изображения здесь

Комментарии:

1. это не объясняется в документации: github.com/AzureAD/microsoft-identity-web/wiki/web-apis

2. @LuisValencia Я думаю, что в документе, которым вы поделились, упоминается роль приложения для потока учетных данных клиента: github.com/AzureAD/microsoft-identity-web/wiki /. … Так что Карл должен быть прав.

3. роль приложения для потока учетных данных клиента предназначена для приложений-демонов.

4. @LuisValencia Вы имеете в виду, что не хотите использовать поток учетных данных клиента? Но почему вы используете поток учетных данных клиента в Postman?

5. Роль приложения @LuisValencia в этом случае является разрешением приложения. Но когда вы решаете предоставить API , ему делегируется разрешение. Я вижу, что вы используете поток учетных данных клиента в Postman, поэтому я подумал, что вы использовали неправильный тип разрешения.