Наше приложение представляет собой веб-приложение, зарегистрированное в 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-соединения: Ошибка: возвращен ответ о несанкционированной/запрещенной ошибке, но сообщение об истечении срока действия токена не получено.