Вызов API Databricks из веб-приложения ASP.NET Core

Наше приложение представляет собой веб-приложение, зарегистрированное в Entra Id. Приложения используют OIDC для аутентификации. Мы добавили область Databricks (user_impersonation) в разрешения API в Entra. Область Databricks (<databrics_app_id>/.default) добавляется в качестве области клиента OpenIdConnect.

Когда пользователь входит в систему, токен доступа, возвращаемый Entra, не имеет области действия user_impersonation. Когда приложение выполняет вызов Databricks с использованием токена доступа, мы получаем ошибку http 401 UnAuthorized.

Я использую OidcClient для входа в систему с помощью OIDC:

var options = new OidcClientOptions()
{
    Authority = "https://login.microsoftonline.com/<tenant_id>",
    ClientId = "<client_id>,
    ClientSecret = "<client_secret>",
    Scope = "<databricks_id>/.default openid",
    Browser = new WpfEmbeddedBrowser(),
    RedirectUri = "https://localhost:<port_no>/callback",
}

options.Policy.Discovery.ValidateEndpoints = false;
options.Policy.Discovery.ValidateIssuerName = false;
var _oidcClient = new OidcClient(options);
var loginResult = await _oidcClient.LoginAsync();

я тоже попробовал

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
        
})
.AddOpenIdConnect("oidc", options =>
{
    options.BackchannelHttpHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
    };

    options.Authority = "https://login.microsoftonline.com/<tenant_id>";

    options.Scope.Add("openid");   
    options.Scope.Add("<databricks_id>/.default");
    //options.Scope.Add("<databricks_id>/user_impersonation");
    options.CallbackPath = "/callback";
    options.ResponseType = "code";
    options.SaveToken = true;
    options.ClientId = "<client_id>";
    options.ClientSecret = "<client_secret>";
}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я надеюсь, что вы предприняли аналогичные действия, чтобы добавить разрешение API для области Databricks. Если да, то, как вы видите, он предоставляет только разрешение Delegated, что означает, что вы не можете использовать .default в качестве области для создания токена доступа, область действия может быть только чем-то похожим на <databricks_id>/user_impersonation

Между тем, когда мы работаем над аутентификацией и авторизацией Azure AD, у нас есть MSAL SDK, который может помочь сократить количество конфигураций.

===================================

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "user.read" })
    .AddInMemoryTokenCaches();
    
builder.Services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();


public class HomeController : Controller
{
    private readonly ITokenAcquisition _tokenAcquisition;
    
    public HomeController(ITokenAcquisition tokenAcquisition)
    {
        _tokenAcquisition = tokenAcquisition;
    }
    
    public async Task<IActionResult> IndexAsync()
    {
        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "<databricks_id>/user_impersonation" });
        return View();
    }
}

<ItemGroup>
  <PackageReference Include = "Microsoft.AspNetCore.Authentication.JwtBearer" Version = "7.0.4" NoWarn = "NU1605" />
  <PackageReference Include = "Microsoft.AspNetCore.Authentication.OpenIdConnect" Version = "7.0.4" NoWarn = "NU1605" />
  <PackageReference Include = "Microsoft.Identity.Web" Version = "2.10.0" />
  <PackageReference Include = "Microsoft.Identity.Web.UI" Version = "1.26.0" />
</ItemGroup>

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "tenant_id",
  "TenantId": "tenant_id",
  "ClientId": "client_id",
  "ClientSecret": "client_secret",
  "CallbackPath": "/signin-oidc",
  "SignedOutCallbackPath ": "/signout-callback-oidc"
},

Я получаю следующую ошибку при вызове API блоков данных с использованием полученного токена доступа. Неожиданный ответ от сервера во время HTTP-соединения: Ошибка: возвращен ответ о несанкционированной/запрещенной ошибке, но сообщение об истечении срока действия токена не получено.

Hemanath 01.04.2024 09:04

Вы имеете в виду, что когда вы используете /user_impersonation в качестве области действия, вы получаете ошибку, отличную от исходной 401? Если да, не могли бы вы получить токен доступа и расшифровать его, чтобы убедиться, что это законный токен?

Tiny Wang 01.04.2024 09:07

Да, получаю другую ошибку. Мне не удалось расшифровать полученный токен доступа, поскольку он непрозрачен.

Hemanath 03.04.2024 08:40

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

Tiny Wang 03.04.2024 08:49

Обновил вопрос с кодом. дайте мне знать, если вам нужна более подробная информация

Hemanath 03.04.2024 12:15

нет кода для генерации токена, вы предоставили код в Program.cs для схемы аутентификации.... Я обновлю свой пост кодами с использованием MSAL.

Tiny Wang 03.04.2024 12:24

мои приведенные выше коды интегрируют схему аутентификации Azure AD в приложение, а затем в моем контроллере я использую ITokenAcquisition для генерации токена доступа, так что область, которую я использовал в контроллере, равна <databricks_id>/user_impersonation, обратите внимание, для делегированного разрешения API он не должен использовать /.default

Tiny Wang 03.04.2024 12:33

Другие вопросы по теме