7

我正在尝试在自定义模块的 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.");

到我的方法的开头,但似乎这是我真的不需要的解决方法,因为它正是该属性的用途。我正在运行 DNN 7.2.1。

有人知道我的属性在哪里出错了吗?

4

3 回答 3

8

Turns out it was actually related to the anti-forgery token. I'm using Angular so I'm setting my headers manually in my Angular service rather than using the built-in ServicesFramework setModuleHeaders method and was only setting the TabId and ModuleId. I didn't think the [AllowAnonymous] attribute would override the anti-forgery stuff but it looks like it definitely does (which is good to know).

Full solution for those doing the same:

var baseUrl = sf.getServiceRoot('[yourmodulename]') + '[controller]';
    var config = {
        headers: {
            'ModuleId': sf.getModuleId(),
            'TabId': sf.getTabId(),
            'RequestVerificationToken': sf.getAntiForgeryValue()
        }
    };
于 2014-03-07T18:33:14.733 回答
2

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

设置ActiveModule和当前用户(从而使您在操作方法中进行检查)的相同过程应该负责实现DnnModuleAuthorize属性的检查。所以,这绝对是令人困惑的。也许这改变了,如果你只是通过ModuleId而不是TabId在标题中,那么它会设置ActiveModule,但不会进行身份验证?

您是否查看过 Fiddler 中的流量并确保正确发送ModuleId和标头?TabId以超级用户(即主机级用户)身份登录是否会影响任何身份验证检查(如果是这样,可能是 URL 没有正确构建,并且 DNN 正在识别错误​​的门户)?

于 2014-03-06T20:44:56.383 回答
0

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

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

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

于 2015-06-11T08:38:50.763 回答