Эквивалент разрешения неоднозначных имен (ANR) LDAP на Microsoft Graph - PullRequest
1 голос
/ 18 июня 2019

Я создаю инструмент, который может быть ориентирован как на Active Directory, так и на Azure AD, который, помимо прочего, ищет user объекты.

Для предварительного просмотра я могу выполнить поиск LDAP, используя неоднозначное разрешение имен с помощью запроса, подобного следующему:

(anr=searchstring*)

Существует ли эквивалентная строка фильтра для Microsoft Graph?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Эквивалентом {string}* является OData startsWith({property},'{string}') Параметр фильтра :

/v1.0/users?$filter=startsWith(displayName,'Adele') 

Обратите внимание, что Microsoft Graph в настоящее время поддерживает только подмножество параметров запроса OData , особенно когда речь идет о фильтрах AAD:

Следующие $filter операторы не поддерживаются для ресурсов Azure AD: negt, ge, lt, le и not.

Кроме того, Microsoft Graph не поддерживает contains или endswith строковые функции в любой рабочей нагрузке.

Вы можете попробовать проверить свои запросы, используя Graph Explorer .

0 голосов
/ 19 июня 2019

Хорошо, поэтому после некоторых проб и ошибок мне удалось воспроизвести разрешение неоднозначных имен, используя синтаксис фильтра.Это не точное совпадение, потому что не все атрибуты доступны для поиска, но я думаю, что это нужно сделать.

Вот мой вспомогательный класс, который я создал для задания.

public static class QueryHelper
{
    public static string GenerateAnrFilter(string query)
    {
        if (string.IsNullOrEmpty(query))
            return query;
        var tokens = query.Split(' ');
        var filterClauses = new List<string>();
        if (tokens.Count() > 1)
        {
            var otherTokens = string.Join(" ", tokens.Skip(1));
            string nameFilter1 = $"({generateFilterClause(tokens[0], "givenName")} and {generateFilterClause(otherTokens, "surname")})";
            filterClauses.Add(nameFilter1);
            string nameFilter2 = $"({generateFilterClause(otherTokens, "givenName")} and {generateFilterClause(tokens[0], "surname")})";
            filterClauses.Add(nameFilter2);
            filterClauses.Add(generateFilterClause(query, "displayName"));
            //filterClauses.Add(generateFilterClause(query, "officeLocation")); // not supported for filter
            filterClauses.Add(generateMultiValueFilterClause(query, "proxyAddresses"));
            filterClauses.Add(generateFilterClause(query, "userPrincipalName"));
            //filterClauses.Add(generateFilterClause(query, "onPremisesSamAccountName")); // not supported for filter
            filterClauses.Add(generateFilterClause(query, "mail"));
            filterClauses.Add(generateFilterClause(query, "mailNickName"));
        }
        else
        {
            filterClauses.Add(generateFilterClause(query, "displayName"));
            filterClauses.Add(generateFilterClause(query, "givenName"));
            filterClauses.Add(generateFilterClause(query, "surname"));
            //filterClauses.Add(generateFilterClause(query, "officeLocation")); // not supported for filter
            filterClauses.Add(generateMultiValueFilterClause(query, "proxyAddresses"));
            filterClauses.Add(generateFilterClause(query, "userPrincipalName"));
            //filterClauses.Add(generateFilterClause(query, "onPremisesSamAccountName")); // not suported for filter
            filterClauses.Add(generateFilterClause(query, "mail"));
            filterClauses.Add(generateFilterClause(query, "mailNickName"));
        }
        var fullQuery = string.Join(" or ", filterClauses);
        return fullQuery;
    }

    private static string generateMultiValueFilterClause(string query, string attributeName)
    {
        return $"{attributeName}/any(a:startswith(a,'{query}'))";
    }

    private static string generateFilterClause(string query, string attributeName)
    {
        return $"startsWith({attributeName},'{query}')";
    }
}
...