#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 только с рабочими и школьными учетными записями.