Моя конечная цель — управлять токеном доступа пользователя с помощью токена обновления. Мне нужен токен от пользователя.
Итак, я попробовал эту логику.
var app = PublicClientApplicationBuilder.Create(clientId)
.WithRedirectUri(redirectUri)
.WithTenantId(tenantId)
.Build();
var accounts = app.GetAccountsAsync().Result;
var authResult = app.AcquireTokenInteractive(scopes)
.ExecuteAsync().Result;
var token = authResult.AccessToken
Ошибка возникает в app.AcquireTokenInteractive(scopes) после входа в систему с учетной записью Microsoft. При выполнении этой функции запускается веб-браузер с запросом на вход в систему. После входа в систему браузер отображает страницу с сообщением о том, что аутентификация учетной записи завершена. После входа в систему ms на этой странице появилось сообщение «Аутентификация завершена. Вы можете вернуться в приложение. Не стесняйтесь закрыть эту вкладку браузера».
И потом, это содержание ошибки.
System.AggregateException HResult=0x80131500 message=Произошла одна или несколько ошибок. (Проблема с конфигурацией препятствует аутентификации. Подробности см. в сообщении об ошибке с сервера. Вы можете изменить конфигурацию на портале регистрации приложений. Подробности см. https://aka.ms/msal-net-invalid-client). Исходное исключение: AADSTS7000218: Тело запроса должно содержать следующий параметр: «client_assertion» или «client_secret». Идентификатор трассировки: ef0f8da8-2e8b-46ce-8ee5-227b97ea0d01 Идентификатор корреляции: e830675e-b28d-48ba-9683-7f4c9bce98c1. 2024 год -07-10 09:00:43З) источник = System.Private.CoreLib Трассировки стека: System.Threading.Tasks.Task.ThrowIfExceptional(логическое значение includeTaskCanceledExceptions) System.Threading.Tasks.Task
1.GetResultCore(Boolean waitCompletionNotification) System.Threading.Tasks.Task
1.get_Result()бросать.
1: MsalServiceException: проблема конфигурации препятствует проверке подлинности. Подробности см. в сообщении об ошибке от сервера. Вы можете изменить конфигурацию на портале регистрации приложений. Подробности см. https://aka.ms/msal-net-invalid-client. Исходное исключение: AADTS7000218: Тело запроса должно содержать следующий параметр: «client_assertion» или «client_secret». Идентификатор трассировки: ef0f8da8-2e8b-46ce-8ee5-227b97ea0d01 Идентификатор корреляции: e830675e-b28d-48ba-9683-7f4c9bce98c1 Временная метка: 10 июля 2024 09:00:43Z
Я имею в виду
var app = PublicClientApplicationBuilder.Create("YOUR_CLIENT_ID")
.WithDefaultRedirectUri()
.Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
}
Перед использованием PublicClientApplicationBuilder
я провел тест , в котором упоминалось, что нужно включить allow public client flows
. Не могли бы вы помочь проверить это? В этом разделе мы видели, что общедоступным клиентским приложениям нельзя доверять безопасное хранение секретов приложений, поэтому они не должны требовать секретности клиента. Поэтому нам следует включить эту опцию.
Я согласен с @TinyWang, PublicClientApplicationBuilder
не требует секрета клиента. Обратитесь к этому MS Document.
Ошибка возникает, если вы пропустили опцию общедоступного клиентского потока или добавили URI перенаправления на платформах, отличных от «Мобильного и настольного приложения».
У меня есть регистрация одного приложения, где я добавил URI перенаправления на платформе Web
, вот так:
Первоначально я тоже получил ту же ошибку в консоли, когда запустил приведенный ниже код с URL-адресом перенаправления на платформе Web
:
var app = PublicClientApplicationBuilder.Create(clientId)
.WithRedirectUri(redirectUri)
.WithTenantId(tenantId)
.Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult authResult = null;
try
{
authResult = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
authResult = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
var token = authResult.AccessToken;
Console.WriteLine($"Access Token: {token}");
Аутентификация браузера:
Ошибка:
Чтобы устранить эту ошибку, обязательно включите опцию общедоступного клиентского потока и добавьте URI перенаправления на платформе Mobile and desktop applications
, удалив его с других платформ:
Когда я снова запустил код после внесения этих изменений, я успешно получил токен доступа, как показано ниже:
using Microsoft.Identity.Client;
class Program
{
private static string clientId = "appId";
private static string tenantId = "tenantId";
private static string redirectUri = "http://localhost";
private static string[] scopes = new string[] { "User.Read" };
static async Task Main(string[] args)
{
var app = PublicClientApplicationBuilder.Create(clientId)
.WithRedirectUri(redirectUri)
.WithTenantId(tenantId)
.Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult authResult = null;
try
{
authResult = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
authResult = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
var token = authResult.AccessToken;
Console.WriteLine($"Access Token: {token}");
}
}
Ответ:
Не могли бы вы указать, на какой платформе вы добавили URI перенаправления и включили ли вы опцию общедоступного потока клиента или нет?