пересылка аутентификации веб-приложения в службу API - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть приложение, которое разбито на веб-приложение (Asp .net MVC), которое взаимодействует со службой API, написанной на C # .net core 2.2.У меня есть веб-приложение, использующее встроенную аутентификацию AZure AD.Это работает нормально, так как запрашивает у пользователя идентификатор домена и пароль Azure и позволяет входить только конкретным пользователям.

Я сделал то же самое для службы API.Весь код startup.cs был настроен соответствующим образом.

Я хотел бы использовать аутентификацию из веб-приложения и переслать в службу API, но не могу найти способ сделать это или даже получить к нему доступ.

Я пытался добавить разные схемы аутентификации (azureadbearer и jwtbearer), но они только заставили веб-приложение не работать, никогда не запрашивалось аутентификацию

В веб-приложении это использует Azure AD и требуетпользователи для аутентификации:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
  .AddAzureAD(options =>
  {
       Configuration.Bind("AzureAd", options);
  });

в службе API, у меня есть

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
      .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

, но я не могу понять, как / что должно вызывать веб-приложение для авторизации или получениятокен для сервиса API.Если я добавлю атрибут [Authorize] для контроллера api, я получу несанкционированную ошибку при его вызове из веб-приложения.

Я хотел бы иметь возможность использовать или получить токен, который был создан, когда пользовательавторизуется в веб-приложении и перенаправляет его в службу API, но в заголовках не увидел ничего похожего на токен jwt.

Я также попытался создать токен jwt в веб-приложении, установить заголовок авторизации (токен носителя) и отправить его в службу API, а также изменил службу API для использования вместо нее jwtbearer, но я все равно получу несанкционированный доступ..

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

Это то, что я пробовал в сервисе API, но не проверял отправленный токен: s

services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme).AddJwtBearer(cfg =>
  {
      cfg.RequireHttpsMetadata = true;
      cfg.SaveToken = true;
      cfg.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
      {
          ValidIssuer = Configuration["ServiceAd:Issuer"],
          ValidAudience = Configuration["ServiceAd:Audience"],
          IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["ServiceAd:ClientSecret"]))
      };
  });

1 Ответ

0 голосов
/ 05 апреля 2019

Я бы предложил использовать OAuth2.0 от имени потока .Согласно вашему требованию, вы хотите аутентифицировать пользователя в веб-приложении и создать токен для веб-API и вызвать веб-API из контроллера веб-приложения.

Сначала создайте 2 принципала службы, один для веб-приложения, а второй -для веб-API.Затем перейдите к принципалу службы веб-приложений -> раздел разрешений и добавьте веб-API (субъект-службы) и предоставьте разрешение.

После создания принципалов службы необходимо использовать поток OAuth 2.0 от имени в сетиКонтроллер приложения.Запустив веб-приложение, вы должны аутентифицировать пользователя с помощью имени пользователя и пароля, после аутентификации пользователя вы можете получить access_token с помощью HttpContext в методе действия вашего контроллера, а затем использовать поток потока «От имени», чтобы получить другой токен дляweb api и вызовите web api для доступа к ресурсу.

Вы можете проверить следующую документацию для потока от имени: OAuth2.0 От имени потока

В веб-приложении -> метод HomeController.cs -> Index () получить текущий токен (при первом входе в систему вы получаете токен доступа), используйте этот токен для создания другого токена для веб-API.

Ниже приведен код для потока от имени:

 private async Task<string> GetOnBehalfToken()
    {
        // Get User Assertion
        var authenticateInfo = await HttpContext.Authentication.GetAuthenticateInfoAsync("Bearer");
        string incomingToken = authenticateInfo.Properties.Items[".Token.access_token"];
        UserAssertion userAssertion = new UserAssertion(incomingClientToken, "urn:ietf:params:oauth:grant-type:jwt-bearer");

        string token = string.Empty;
        string authString = string.Format(this.azureAd.AadInstance, this.azureAd.TenantId);
        AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);

        // config for oauth client credentials
        // Use Web app client id and secret key
        ClientCredential clientCredential = new ClientCredential(this.azureAd.ClientId, this.azureAd.AppKey);

        // App ID uri of web api service principal
        var resource = "https://<tenant>.onmicrosoft.com/45854ee0-608a-4dff-xxx-xxxxxxxxxxx";

        AuthenticationResult result = await authenticationContext.AcquireTokenAsync(resource, clientCredential);
        return result.AccessToken;
    }

Как только вы получите токен для веб-API, добавьте его в заголовок авторизации клиента http и выполните вызов API.

Если вы хотите только аутентифицировать свой веб-API с помощью Azure AD.Используйте приведенный ниже код при запуске и посмотрите, работает ли он для вас:

public static void ConfigureAuthentication(IAppBuilder app)
    {
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
           new WindowsAzureActiveDirectoryBearerAuthenticationOptions
           {
               Tenant = Configuration["AzureAD.TenantId"],
               TokenValidationParameters = new TokenValidationParameters()
               {
                   ValidateIssuer = true,
                   ValidIssuer = Configuration["AzureAD.Issuer"],
                   ValidAudience = Configuration["AzureAD.Audience"],
                   ValidateLifetime = true
               }
           });

        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = true,
                    ValidIssuer = Configuration["AzureAD.Issuer"],
                    ValidAudience = Configuration["AzureAD.Audience"],
                    ValidateLifetime = true
                }
            });
    }

Также убедитесь, что значения Issuer ({tenant-name} .onmicrosoft.com) и Audience (идентификатор приложения из принципала службы),это должно быть правильно.

Я надеюсь, что это решит вашу проблему.

...