Microsoft Graph — альтернатива учетным данным пароля владельца ресурса

#c# #oauth-2.0 #asp.net-mvc-5 #azure-active-directory #microsoft-graph-api

#c# #oauth-2.0 #asp.net-mvc-5 #azure-active-directory #microsoft-graph-api

Вопрос:

Вот контекст:

  • У меня есть внешнее приложение (назовем его EA), которое содержит пользователей. Каждый пользователь может войти в систему, используя адрес электронной почты и пароль.

  • У меня есть Azure Active Directory, поддерживающий пользователей. Это точно те же пользователи, что и в EA.

Вот сценарий:

  • Вход пользователя в советник. В EA пользователь может создать онлайн-совещание Microsoft Teams, используя Graph API (создание собрания уже выполнено и работает).

Вот в чем проблема:

  • Пользователю необходимо вручную повторно войти в Azure Active Directory, чтобы создать онлайн-совещание Microsoft Teams, даже если он зарегистрирован в EA.

Вот мое уродливое исправление:

  • Я использовал учетные данные пароля владельца ресурса для повторного входа пользователя в серверную часть. Я сделал это следующим образом: когда пользователь пытается создать онлайн-собрание, ему предлагается снова ввести пароль в форме HTML. Форма в конечном итоге приводит к этому методу, восстанавливая токен доступа Azure Active Directory:
     public async Task<string> GetTokenUser(string email, string password) 
    {
        string token = null;
        var clientID = "<ApplicationClientID>";
        var secret = "<ApplicationSecret>";
        var tenantID = HttpUtility.UrlEncode("<TenantDomain>");
        var resource = HttpUtility.UrlEncode("https://graph.microsoft.com");
        email= HttpUtility.UrlEncode(email);
        password= HttpUtility.UrlEncode(password);

        using (HttpClient client = new HttpClient())
        {
            var tokenEndpoint = @"https://login.windows.net/"   tenantID   "/oauth2/token";
            var accept = "application/json";

            client.DefaultRequestHeaders.Add("Accept", accept);
            string postBody = @"resource="   resource   @"
                                amp;client_id="   clientID   @"
                                amp;client_secret="   secret    @"
                                amp;grant_type=password
                                amp;username="   email   @"
                                amp;password="   password   "amp;scope=openid";

            using (var response = await client.PostAsync(tokenEndpoint, new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded")))
            {
                if (response.IsSuccessStatusCode)
                {
                    var jsonresult = JObject.Parse(await response.Content.ReadAsStringAsync());
                    token = (string)jsonresult["access_token"];
                }
            }
        }

        return token;
    }
  

Вот что мне нужно:

  • Мне нужно найти лучший способ входа пользователя в Azure Active Directory без повторного запроса пароля. Есть ли какой-либо способ сообщить Azure Active Directory, что пользователь X вошел в систему по электронной почте, без необходимости отправлять обычный текстовый пароль?

Важное примечание: у меня нет абсолютно никаких предпочтений в отношении того, как этого можно достичь, если оно работает и является надежным.

Правка 1: опечатка в коде

Ответ №1:

Проверка подлинности Azure AD необходима, если вы хотите получить доступ к Microsoft Graph.

Create onlineMeeting поддерживает только делегированные разрешения, что означает, что вы должны следовать Get access от имени пользователя, чтобы получить маркер доступа.

Поэтому, если вы не хотите использовать поток ROPC, вам необходимо интегрировать авторизацию AAD в свой проект.

Пожалуйста, следуйте этому документу, чтобы узнать, как это сделать.

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

1. Большое вам спасибо. Я проверю это и свяжусь с вами в этот понедельник.

2. Я проверил ссылки, они определенно полезны. Спасибо!