Я следил за внедрением содержимого Power BI с помощью субъекта-службы и секретного руководства приложения и Мне удалось успешно настроить пример данных о собственности приложения.
Теперь я хотел бы опубликовать это приложение, чтобы администратор Azure другой организации в Microsoft Entra мог авторизовать приложение и внедрить одно из его отчеты. В конечном итоге пользователю не нужно будет входить в систему, и он сможет делегировать другому пользователю (не из своей организации Microsoft, а внутри приложения) просмотр отчета, поэтому мне нужно авторизовать
приложение (для управления данными PowerBI без входа пользователя в систему.
Пример этого варианта использования приведен здесь, в .Net Framework. Я также видел связанные примеры в этом файле Readme. здесь для .Net Core, но для всех этих примеров требуется ручной процесс создания субъекта-службы в Microsoft Entra и авторизации этого субъекта-службы в PowerBI.
Мне удалось зарегистрировать приложение в Microsoft Entra (через регистрацию приложений), а также возможность войти в мое приложение как пользователь из другой организации. Это создает «Корпоративное приложение» внутри клиента пользователя. Теперь, когда я пытаюсь получить токен для PowerBI, используя clientId моего приложения, я получаю сообщение «Неавторизованный». сообщение.
Вот соответствующий код в моем приложении:
appsettings.json
Код: Выделить всё
{
"AzureAd": {
"AuthorityUrl": "https://login.microsoftonline.com/organizations/",
"Instance": "https://login.microsoftonline.com/",
"Domain": "", // this is the domain where I registered my app
"ClientId": "", // this is the clientId of the registered app
"TenantId": "organizations",
"ScopeBase": ["https://analysis.windows.net/powerbi/api/.default"],
"ClientSecret": "", // this is the secret I've added to the registered app
"CallbackPath": "/signin-oidc"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Код: Выделить всё
WebApplicationBuilder? builder = WebApplication.CreateBuilder(args);
builder.Services.Configure(config.GetSection(key: nameof(AzureAd)));
builder
.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(config);
builder
.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddMicrosoftIdentityConsentHandler();
builder.Services
.AddControllersWithViews()
.AddMicrosoftIdentityUI();
Однако, когда я пытаюсь сгенерировать токен для это:
Код: Выделить всё
IOptions options = services.GetRequiredService();
string tenantSpecificUrl = options.Value.AuthorityUrl?.Replace("organizations", "") ?? string.Empty;
var clientApp = ConfidentialClientApplicationBuilder
.Create(options.Value?.ClientId)
.WithClientSecret(options.Value?.ClientSecret)
.WithAuthority(tenantSpecificUrl)
.Build();
AuthenticationResult authenticationResult = clientApp
.AcquireTokenForClient(options.Value?.ScopeBase)
.ExecuteAsync()
.Result;
string token = authenticationResult.AccessToken;
TokenCredentials tokenCredentials = new(token, "Bearer");
var powerBIClient = new PowerBIClient(new Uri("https://api.powerbi.com"), tokenCredentials);
var groups = await powerBIClient.Groups.GetGroupsAsync();
Я уверен, что в том, как я это делаю, есть что-то фундаментально неправильное, но я не могу найти никаких примеров. автоматического создания субъекта-службы в любом месте.
Любая помощь будет очень признательна!
Подробнее здесь: https://stackoverflow.com/questions/792 ... werbi-data
Мобильная версия