Как проверить, входит ли пользователь Sharepoint в группу безопасности, независимо от того, входит ли он в CSOM группы AD

У меня есть приложение, размещенное в SharePoint, и мне нужно проверить, входит ли текущий пользователь в группу безопасности SharePoint, независимо от того, находится ли он в AD внутри группы. Следующий код проверяет, входит ли пользователь в группу безопасности, но только если он явно входит в группу безопасности. Код не просматривает подгруппы, входящие в группу безопасности.

    function getItems() {

    // only execute this function if the script has been loaded
    if (ready) {

        // the url to use for the REST call.
        var url = SPAppWebUrl + "/_api/SP.AppContextSite(@target)" +
            "/web/lists/getbytitle('" + TituloListaEventos + "')/items?$select=Title,Category,StartDate,EndDate,EncodedAbsUrl,ID,LinkSolicitud&$filter=Category eq '" + Categoria + "'" +
            "&@target='" + SPHostUrl + "'";

        // create  new executor passing it the url created previously
        var executor = new SP.RequestExecutor(SPAppWebUrl);

        // execute the request, this is similar although not the same as a standard AJAX request
        executor.executeAsync(
            {
                url: encodeURI(url),
                method: "GET",
                headers: { "Accept": "application/json; odata=verbose" },
                success: function (data) {
                    IsCurrentUserMemberOfGroup("Solicitantes", function (isSolicitante) {
                    ...
                },
                error: function (data) {
                    ...
                }
            });

    }
}

function IsCurrentUserMemberOfGroup(groupName, OnComplete) {

    var currentContext = new SP.ClientContext.get_current();
    var currentWeb = currentContext.get_web();

    var currentUser = currentContext.get_web().get_currentUser();
    currentContext.load(currentUser);

    var allGroups = currentWeb.get_siteGroups();
    currentContext.load(allGroups);

    var group = allGroups.getByName(groupName);
    currentContext.load(group);

    var groupUsers = group.get_users();
    currentContext.load(groupUsers);

    currentContext.executeQueryAsync(OnSuccess, OnFailure);

    function OnSuccess(sender, args) {
        var userInGroup = false;
        var groupUserEnumerator = groupUsers.getEnumerator();
        while (groupUserEnumerator.moveNext()) {
            var groupUser = groupUserEnumerator.get_current();
            if (groupUser.get_id() == currentUser.get_id()) {
                userInGroup = true;
                break;
            }
        }
        OnComplete(userInGroup);
    }

    function OnFailure(sender, args) {
        OnComplete(false);
    }
}

person Sebastián A    schedule 31.07.2015    source источник
comment
Я пытался сделать это раньше, но, если я правильно помню, это невозможно.   -  person Daniel B    schedule 06.08.2015


Ответы (1)


Клиентская объектная модель SharePoint не поддерживает чтение активных групп каталогов. Возможно, вам придется создать настраиваемую веб-службу. ЕСЛИ у вас есть возможность использовать .NET, я настоятельно рекомендую это сделать, потому что он отлично работает при доступе к данным SharePoint и перекрестных ссылках с данными Active Directory.

person Eric    schedule 12.08.2015