Не используйте предоставление пароля ROPC и не собирайте имя пользователя / пароль непосредственно в вашем API
Я вижу, что вы ожидаете, что имя пользователя и пароль будут предоставлены непосредственно вашему API для получения токена с использованием ROPC или предоставления пароля. Это нарушает рекомендации по безопасности, а также имеет функциональные ограничения, например, не работает с MFA. Вы можете посмотреть этот пост для аналогичного обсуждения, и есть много других ресурсов, которые подтвердят то же самое для вас. Здесь - старая статья, но все еще очень подробная. И посмотрите на длинный список ограничений в конце.
Я ссылаюсь на этот код, которым вы поделились:
public async Task<IActionResult> GetAzureOAuthData([FromBody]dynamic parameters)
{
string userName = parameters.userName.ToString();
string password = parameters.password.ToString();
using (HttpClient client = new HttpClient())
{
var oauthEndpoint = new Uri("https://login.microsoftonline.com/organizations/oauth2/v2.0/token");
var result = await client.PostAsync(oauthEndpoint, new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("client_id", _azureOptions.ClientId),
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", userName),
new KeyValuePair<string, string>("password", password),
Причина, по которой ваш неограниченный метод не работает
Вы получаете токен для своего собственного API, используя предоставление пароля. Тогда вы на самом деле не используете «От имени потока» для приобретения токена для Microsoft Graph от имени пользователя, вызвавшего ваш API.
Таким образом, токен действителен для вашего API, но не для Microsoft Graph API, и, следовательно, вы получаете ошибку UnAuthorized.
Другой метод, который вы называете ограниченным методом, выполняет поток от имени, сначала получая токен для Microsoft Graph API от имени пользователя.
string realAccessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, scopes).ConfigureAwait(false);
Лучшие идеи, как вы просите об этом
Клиентское приложение, которое вызывает ваш API, должно использовать делегированные разрешения и потоки OAuth, такие как поток предоставления кода авторизации или другие, в зависимости от вашего сценария, чтобы получить токен доступа для вашего API.
API может затем использовать поток On-Behalf-Of, как вы делаете это в ограниченном методе, чтобы получить токен, требуемый Microsoft Graph API.