Мне немного трудно понять, почему я получаю статус 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)]
не подходит!?