Авторизация API службы DotNetNuke выдает 401 Неавторизованный код

Мне немного трудно понять, почему я получаю статус 401 Unauthorized из сервисной структуры. На данный момент я настроил его так, чтобы каждый мог делать все, что ему заблагорассудится, но это потому, что когда я пытаюсь включить авторизацию, я получаю код ошибки 401.

//[SupportedModules("Boards")]
//[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)]
[AllowAnonymous]
public class BoardsServiceController : DnnApiController
{ ... }

Странно то, что у меня есть другой модуль, который более чем счастлив работать с DnnModuleAuthorize.

[SupportedModules("Assignments")]
[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)]
public class AsgnsServiceController : DnnApiController
{ ... }

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

Я сделал перекрестные ссылки на оба проекта, и все, кажется, на месте. Тем не менее, один работает нормально, а другой возвращает 401.

Какие-либо предложения?

Обновлять

Для модуля «Назначения» я в основном использую jQuery стиль ajax-запроса только потому, что у меня нет времени пересматривать модуль. Таким образом, типичный запрос GET будет выглядеть примерно так:

$.ajax({
    type: "GET",
    url: sf.getServiceRoot( "Assignments" ) + "AsgnsService/GetAssignments",
    data: data,
    beforeSend: sf.setModuleHeaders
}).done( function ( items ) {
    //removed for brevity
}).fail( function ( xhr, result, status ) {
    //removed for brevity
});

Что касается модуля Boards, структура кода немного отличается из-за реализации нокаута. Существует специальный ServiceCaller, но все это сводится к тому же вызову ajax к серверу, за исключением того, что вместо полномасштабного вызова ajax, определенного, как указано выше, он выглядит намного аккуратнее.

var that = this;

that.serviceCaller = new dnn.boards.ServiceCaller($, this.moduleId, 'BoardsService');

var success = function (model) {
    if (typeof model !== "undefined" && model != null) {
        viewModel = new boardViewModel(model.colLists);

        ko.bindingHandlers.sortable.beforeMove = viewModel.verifyAssignments;
        ko.bindingHandlers.sortable.afterMove = viewModel.updateLastAction;

        // normally, we apply moduleScope as a second parameter
        ko.applyBindings(viewModel, settings.moduleScope);
    }

    //console.log('success', model);
};

var failure = function (response, status) {
    console.log('request failure: ' + status);
};

var params = {
    BoardId: this.boardId
};

that.serviceCaller.get('GetBoardLists', params, success, failure);

А сама функция ServiceCaller ajax выглядит так:

function (httpMethod, method, params, success, failure, synchronous) {
    var options = {
        url: that.getRoot() + method,
        beforeSend: that.services.setModuleHeaders,
        type: httpMethod,
        async: synchronous == false,
        success: function (d) {
            if (typeof (success) != 'undefined') {
                success(d || {});
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            if (typeof (failure) != 'undefined') {
                var message = undefined;

                if (xhr.getResponseHeader('Content-Type').indexOf('application/json') == 0) {
                    try {
                        message = $.parseJSON(xhr.responseText).Message;
                    } catch (e) {
                    }
                }

                failure(xhr, message || errorThrown);
            }
        }
    };

    if (httpMethod == 'GET') {
        options.data = params;
    } else {
        options.contentType = 'application/json; charset=utf-8';
        options.data = ko.toJSON(params);
        options.dataType = 'json';
    }

    $.ajax(options);
};

Это будут два GET-запроса от двух разных модулей, где один доволен, а другой выдает статус 401, когда я включаю одни и те же аннотации.

Дает ли это какие-то подсказки?

Обновлять

Теперь, говоря обо всем вышесказанном, если взглянуть на исходный Базовый код модуля Boards можно заметить аннотацию [DnnAuthorize], прикрепленную к каждой функции.

Во время пересмотра модуля я удалил все экземпляры аннотации [DnnAuthorize] и заменил ее двумя собственными в самом классе обслуживания.

Когда я добавляю [DnnAuthorize] в качестве аннотации к самому классу обслуживания, все работает так, как ожидалось. Так почему же комбинация [SupportedModules("Boards")] и [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)] не подходит!?


person iiminov    schedule 23.01.2015    source источник
comment
Можете ли вы показать свой код, который вызывает службу?   -  person braindice    schedule 23.01.2015
comment
Я надеюсь, что мое последнее обновление поможет пролить свет на то, что я упускаю из виду.   -  person iiminov    schedule 26.01.2015


Ответы (1)


Я не уверен, но работая с WebAPI, вы должны зарегистрировать защиту от подделки Service Framework.

 ServicesFramework.Instance.RequestAjaxAntiForgerySupport();

Это часть запроса API на работу с определенным модулем.

person braindice    schedule 27.01.2015
comment
Я зарегистрировал это внутри OnInit() вместе с некоторыми другими скриптами. Но я думал, что он используется только с аннотацией [ValidateAntiForgeryToken] для двойной проверки правильности запросов. В частности, POST-запросы. - person iiminov; 27.01.2015
comment
может быть - мой намного проще, поэтому, возможно, сложность что-то скрывает, загружаете ли вы var с помощью jquery servcie framework - var sf = $.ServicesFramework(moduleid); - person braindice; 28.01.2015
comment
Да, он определен внутри ServiceCaller как this.services = $.dnnSF(moduleId); - person iiminov; 28.01.2015
comment
На самом деле, знаете ли вы, используется ли <packageName> или <moduleName> из файла манифеста для сопоставления с аннотацией [SupportedModules("?")]? Или это что-то совсем другое? - person iiminov; 28.01.2015