Наше приложение представляет собой веб-приложение, зарегистрированное в 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>";
}





Я надеюсь, что вы предприняли аналогичные действия, чтобы добавить разрешение 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"
},
Вы имеете в виду, что когда вы используете /user_impersonation в качестве области действия, вы получаете ошибку, отличную от исходной 401? Если да, не могли бы вы получить токен доступа и расшифровать его, чтобы убедиться, что это законный токен?
Да, получаю другую ошибку. Мне не удалось расшифровать полученный токен доступа, поскольку он непрозрачен.
Не могли бы вы добавить более подробную информацию о том, как вы генерируете такой непрозрачный токен? Я никогда не сталкивался с подобной проблемой, я сталкивался с исключением при создании токена, или токен неверен и имеет неправильную аудиторию или область действия.
Обновил вопрос с кодом. дайте мне знать, если вам нужна более подробная информация
нет кода для генерации токена, вы предоставили код в Program.cs для схемы аутентификации.... Я обновлю свой пост кодами с использованием MSAL.
мои приведенные выше коды интегрируют схему аутентификации Azure AD в приложение, а затем в моем контроллере я использую ITokenAcquisition для генерации токена доступа, так что область, которую я использовал в контроллере, равна <databricks_id>/user_impersonation, обратите внимание, для делегированного разрешения API он не должен использовать /.default
Я получаю следующую ошибку при вызове API блоков данных с использованием полученного токена доступа. Неожиданный ответ от сервера во время HTTP-соединения: Ошибка: возвращен ответ о несанкционированной/запрещенной ошибке, но сообщение об истечении срока действия токена не получено.