401: несанкционированная проблема в веб-API .net core C#

#c# #reactjs #azure-active-directory #authorization #webapi

Вопрос:

     I am getting JWT Token from the React UI using AcquireTokenSilent of MSAL. Now, I have to call Graph API using this token in Web API(.net core) in C#.
    Before calling the Graph API I am getting "401 :Unauthorized". Please help me in resolving the issue.       
    
    In Startup.cs I am using following code:
    ----------
    public void ConfigureServices(IServiceCollection services)
                {
                    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                        .AddMicrosoftIdentityWebApi(Configuration,"AzureAd")
                            .EnableTokenAcquisitionToCallDownstreamApi()
                                .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
                                .AddInMemoryTokenCaches();
                }
        
        
          public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
               {
                   app.UseAuthentication();
                   app.UseRouting();
                   app.UseAuthorization();
               }
        
       
         In ProfileController.cs
        
         [HttpPost]
                public async Task<ActionResult> PostProfileItem([FromBody]SetProfile setprofile)
                {
                     
                    HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
                     
                    try
                    {
                        List<HeaderOption> requestHeaders = new List<HeaderOption>() { new HeaderOption("Authorization", "Bearer "   setprofile.access_token) };
                        User profile = await _graphServiceClient.Me.Request(requestHeaders).GetAsync();
                }
               (catch Exception ex)
                {
                }
              return Ok(profile);
            }
        
            SetProfile.cs
        namespace Web.Dto
        {
            public record SetProfile
            {
               [NotMapped]
               [JsonProperty("access_token")]
               [Required]
                public string access_token { get; init; }
               
            }
        
            
        }
    
   
    
    
 

Код пользовательского интерфейса React, получающий токен и отправляющий токен доступа в ProfileController.cs

если (!graphData amp;amp; InProgress === Состояние взаимодействия.Никто) { //экземпляр данных из формы, дайте виде FormData = новые виде FormData() // приобрести молчаливая инстанции.acquireTokenSilent(accessTokenRequest) //то предложение .затем((accessTokenResponse) => { // приобретение молчаливая успех пусть специального accessToken = accessTokenResponse.маркер accessToken; //ведения журнала консоли токен доступа.журнал( access token : ${accessToken} ) //код, чтобы добавить токен доступа в API виде FormData.добавить(«маркер доступа», специального accessToken) //вызов профилей реквизит по API.userProfileCall(виде FormData) }); //код, чтобы поймать ошибку }).улов((ошибка) => { //ведение журнала ошибок консоли.войти(ошибка); })

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

1. Было бы лучше показать нам вашу реакцию. Как вы передаете жетон?

2. Я добавил часть реакции. Пожалуйста, помогите мне.

3. Несколько вещей, которые необходимо подтвердить, требует ли ваш токен разрешения для graph api того, кому вы пытаетесь позвонить? другое дело, не могли бы вы проверить свой токен здесь , чтобы дважды проверить, действителен ли он в соответствии с вашим контекстом?

Ответ №1:

Решение 1:

1) Для доступа к любому веб-API из Reactjs или любого метода Ajax Веб-API должен включать CORS

Вам необходимо установить политику CORS, чтобы иметь возможность вызывать API в Startup.cs.

  services.AddCors(o => o.AddPolicy("default", builder =>
    {
        builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
    })
 

2) В вашем контроллере добавьте декоратор [Авторизация], который будет следить за тем, чтобы все входящие запросы имели носителя аутентификации

Пример:

  [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
    }
 

Решение 2:
Убедитесь, что вы предоставили пользователю разрешение.Читать.Все приложения.

  1. Войдите на портал Azure.
  2. Если у вас есть доступ к нескольким арендаторам, используйте фильтр Каталог подписка в верхнем меню, чтобы выбрать арендатора, содержащего регистрацию вашего клиентского приложения.
  3. Выберите Azure Active Directory > Регистрация приложений>, а затем выберите клиентское приложение.
  4. Выберите разрешения API > Добавить разрешение >> Microsoft Graph >>> Разрешения приложений>>>.

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

  1. Все разрешения, предоставляемые Microsoft Graph, отображаются в разделе «Выберите разрешения«.

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

  1. Выберите User.Read.All и нажмите «Добавить разрешения».
    введите описание изображения здесь

Для получения более подробной информации обратитесь к этому документу