Dotnetnuke DNNModuleAuthorization属性在Web API中始终返回Unauthorized

Dotnetnuke DNNModuleAuthorization属性在Web API中始终返回Unauthorized,dotnetnuke,dotnetnuke-module,dotnetnuke-7,Dotnetnuke,Dotnetnuke Module,Dotnetnuke 7,我试图在自定义模块的web API中的方法上使用此属性: [DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.Edit)] 但无论我设置了什么SecurityAccessLevel,我总是得到401未经授权的响应 我可以通过添加以下内容使代码正常工作: [AllowAnonymous] 关于方法,并添加: if (!ModulePermissionController.CanEditModuleC

我试图在自定义模块的web API中的方法上使用此属性:

[DnnModuleAuthorize(AccessLevel = DotNetNuke.Security.SecurityAccessLevel.Edit)]
但无论我设置了什么SecurityAccessLevel,我总是得到401未经授权的响应

我可以通过添加以下内容使代码正常工作:

[AllowAnonymous]
关于方法,并添加:

if (!ModulePermissionController.CanEditModuleContent(this.ActiveModule))
                return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "You do not have permission to access this content.");
在我的方法的开始,但这似乎是一个我真的不需要的变通方法,因为它正是该属性的用途。我正在运行DNN7.2.1


有人知道我的属性哪里出了问题吗?

您的控制器(或操作方法)是否应用了
SupportedModules
属性?如果是这样的话,我猜您在那里传递的名称与DNN中的真实名称不匹配(您应该传递桌面模块名称)。尝试删除该属性,看看是否有帮助

设置
ActiveModule
和当前用户(从而使操作方法中的检查生效)的同一进程应负责执行
DnnModuleAuthorize
属性的检查。所以,这确实令人困惑。也许这已经改变了,如果您只是在标题中传递
ModuleId
而不是
TabId
,那么它会设置
ActiveModule
,但不会进行身份验证


您是否查看了Fiddler中的流量,并确保正确发送了
ModuleId
TabId
标题?作为超级用户(即主机级用户)登录是否会影响任何身份验证检查(如果是,可能是URL构造不正确,DNN识别的门户错误)?

证明它实际上与防伪令牌有关。我使用的是Angular,所以我在Angular服务中手动设置标题,而不是使用内置的ServicesFrameworkSetModuleHeaders方法,并且只设置TabId和ModuleId。我不认为[AllowAnonymous]属性会覆盖防伪内容,但它看起来确实会覆盖防伪内容(很高兴知道这一点)

针对执行相同操作的用户的完整解决方案:

var baseUrl = sf.getServiceRoot('[yourmodulename]') + '[controller]';
    var config = {
        headers: {
            'ModuleId': sf.getModuleId(),
            'TabId': sf.getTabId(),
            'RequestVerificationToken': sf.getAntiForgeryValue()
        }
    };

初始化ServicesFramework时,请确保在document.ready函数中进行初始化

    var self = {};
    jQuery(document).ready(function ($) {
        self.sf = $.ServicesFramework(<%=ModuleID %>);
    });
var self={};
jQuery(文档).ready(函数($){
self.sf=$.ServicesFramework();
});

更多信息:www.dnnsoftware.com/forums/threadid/507753/scope/posts/services framework problems

Hey Brian。SupportedModules已应用于控制器(但不是DnnSupportedModules,假设这只是一个输入错误?),也尝试将其移动到方法,但没有帮助;标头被正确地传递和解析,所有其他与这些ID相关的功能都能正常工作;作为超级用户登录没有任何影响。@ChrisSearles是的,那是个打字错误。尝试删除
SupportedModules
属性,看看是否有帮助(我用详细信息/建议更新了答案)。尝试了一下,没有成功。另外,刚刚在Fiddler中进行了双重检查,标题肯定被正确地发送了(包括选项卡和模块ID)。以“主机”身份登录,效果很好。以“注册用户”或“订户”身份登录时,401未经授权。发现解决方案是缺少[SupportedModules]属性。添加[SupportedModules(“myModuleNameAsInManifest”)]会产生不同的错误,这是一个未定义的敲除变量,给定“值”'undefined',数据库中只有varchar(6)分配,因此返回截断错误,如下所述:是的,
AllowAnonymous
属性是。。。不太好。它完全忽略了auth管道中的其余部分。嘿,克里斯,你是如何得到AntiForgeryValue的。我不认为你能从JS那里得到它。您是否使用http get获取它?@JKing您必须在客户端上初始化服务框架。请查看这个详细的示例:感谢您跟踪Chris。这正是我想要的,也是我需要的最后一件事,让我的服务的安全工作。