Произошла одна или несколько ошибок. (ROPC не поддерживает учетные записи MSA. Видишь https://aka.ms/msal-net-ropc для получения более подробной информации. )

#c# #azure-active-directory #microsoft-graph-api

Вопрос:

Я пригласил некоторых пользователей использовать мой веб-API, письма с приглашениями успешно отправлены, и пользователи отображаются в списке пользователей в Azure AD.

Когда пользователи пытаются войти в мой веб-API, они получают следующую ошибку:

Произошла одна или несколько ошибок. (ROPC не поддерживает учетные записи MSA. Видишь https://aka.ms/msal-net-ropc для получения более подробной информации. )

Приведенный ниже код отправляет приглашения

 [EnableCors("CorsPolicy")]
[HttpPost, Route("invite")]
[AllowAnonymous]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[Produces("application/json")]
public ActionResult SendInvitation(UserModel user)
{
    try
    {
        string clientId = Configuration["AzureAd:ClientId"];
        string tenantID = Configuration["AzureAd:TenantId"];
        string authority = Configuration["AzureAd:Authority"];

        IPublicClientApplication app = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantID)
            .WithAuthority(authority)
            .Build();

        string[] scopes = new string[] { "User.Invite.All" }; 

        // Build the Microsoft Graph client. As the authentication provider, set an async lambda
        // which uses the MSAL client to obtain an app-only access token to Microsoft Graph,
        // and inserts this access token in the Authorization header of each API request. 
        GraphServiceClient graphServiceClient =
            new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
            {

                var securePassword = new SecureString();
                foreach (char c in user.Password.ToCharArray()) // you should fetch the password
                    securePassword.AppendChar(c);               // keystroke by keystroke

                // Retrieve an access token for Microsoft Graph (gets a fresh token if needed).
                var authResult = await app
                        .AcquireTokenByUsernamePassword(scopes, user.UserName, securePassword).ExecuteAsync();

                // Add the access token in the Authorization header of the API request.
                requestMessage.Headers.Authorization =
                        new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
            })
            );

        var invitation = new Invitation
        {
            InvitedUserEmailAddress = "user@email.com",
            InviteRedirectUrl = "https://webapi.azurewebsites.net",
            SendInvitationMessage = true
        };

        graphServiceClient.Invitations
            .Request()
            .AddAsync(invitation);
        return Ok("Invitation sent.");
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}
 

Ответ №1:

Я боюсь, что ваш проект не может быть реализован.

Пожалуйста, ознакомьтесь с Важным советом в документе ROPC flow.

введите описание изображения здесь

MSA (личные учетные записи) не может использовать ROPC независимо от того, приглашен он в клиент AAD или нет.

Поток ROPC работает только для рабочих учетных записей.

Об этом также говорится в ссылке https://aka.ms/msal-net-ropc.

введите описание изображения здесь

Вы можете рассмотреть возможность использования потока учетных данных клиента (разрешение приложения) или потока кода аутентификации (делегированное разрешение, требуется интерактивный вход в систему).

Найдите соответствующие примеры поставщиков услуг аутентификации по этой ссылке.

Комментарии:

1. Значит, моя реализация будет работать только для учетных записей Work amp; School? Именно это мне и было нужно 😉

2. @Tassisto Да. Ты прав. Вы можете использовать поток ROPC только с рабочими и школьными учетными записями.