8

我正在为 DotNetNuke 6 网站构建一个 REST API,使用 DNN 的基于 MVC 的服务框架。但是,我没有任何身份验证背景,所以我什至不确定从哪里开始。

基本上,我们希望我们的客户能够对他们的门户数据发出 GET 请求,并且我们希望一些客户(但不是全部)能够发布对其用户数据的简单更新。

我一直在尝试搜索信息,但问题是我不确定我在搜索什么。DNN 有不同的登录名和角色,但我不确定它们是否或如何影响。我听说过 oAuth 之类的东西,但我对它的理解是最基本的。我不知道它是否是我需要的,也不知道它是否或如何适用于 DNN。谁能指出我正确的方向?

更新:基于以下关于将其与模块绑定和进一步研究的答案,这是我所做的:

我专门为此服务创建了一个模块,并为它添加了两个特殊权限:“APIGET”和“APIPOST”。我将这些分配给 DNN 中的一些测试角色/测试帐户。我编写了一个自定义授权属性,给定模块 ID,检查当前用户是否具有必要的权限(通过角色或直接)。据我所知,标签 ID 与我的情况无关。

它似乎同时使用网络浏览器(基于我登录的 DNN 帐户)和使用帐户用户名/密码发送 HTTP 请求的 php 脚本。

授权属性:

using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Portals;
using DotNetNuke.Security;
using DotNetNuke.Security.Permissions;
using System.Web;

public class MyAuthorize : DotNetNuke.Web.Services.AuthorizeAttributeBase
{
    public const string AuthModuleFriendlyName = "MyAuthModule";
    public const string GETPermission = "APIGET";
    public const string POSTPermission = "APIPOST";

    public string Permission { get; set; }

    protected override bool AuthorizeCore(HttpContextBase context)
    {
        ModuleController mc = new ModuleController();

        ModuleInfo mi = mc.GetModuleByDefinition(PortalController.GetCurrentPortalSettings().PortalId, AuthModuleFriendlyName);

        ModulePermissionCollection permCollection = mi.ModulePermissions;

        return ModulePermissionController.HasModulePermission(permCollection, Permission);
    }
}

控制器:(“mytest”是 GET 和 POST 的端点)

public class MyController : DnnController
{
    [ActionName("mytest")]
    [AcceptVerbs(HttpVerbs.Get)]
    [DnnAuthorize(AllowAnonymous = true)]
    [MyAuthorize(Permission = MyAuthorize.GETPermission)]
    public string myget(string id = "")
    {
        return "You have my permission to GET";
    }

    [ActionName("mytest")]
    [AcceptVerbs(HttpVerbs.Post)]
    [DnnAuthorize(AllowAnonymous = true)]
    [MyAuthorize(Permission = MyAuthorize.POSTPermission)]
    public string mypost(string id = "")
    {
        return "You have my permission to POST";
    }
}
4

4 回答 4

8

将 DNN 服务框架中的服务绑定到 DNN 权限的主要方法是将权限与模块实例相关联。也就是说,您将要求您的服务的用户确定他们从哪个模块调用/关于哪个模块(通过在请求 [headers, query-string, cookies, form] 中发送 ModuleId 和 TabId),然后您可以指示哪些权限他们需要在该模块上对服务采取特定操作。

您可以SupportedModules在服务上使用该属性,并传入以逗号分隔的模块名称列表,以确保只允许您自己的模块。然后,DnnModuleAuthorize在服务或个人操作级别添加属性,以说明用户在该模块上需要什么权限。在您的实例中,您还可以AllowAnonymous在操作上添加属性GET,并DnnModuleAuthorize在服务上添加一个属性,用于POST方法(以及其他任何内容)。请注意,您不能将AllowAnonymous属性放在控制器上;它将覆盖对操作的授权,从而无法使操作更具限制性。

您还需要ValidateAntiForgeryToken在操作上添加属性POST,以防止 CSRF 攻击。

如果您没有一个模块可以自然地将其权限与您的服务相关联,您可以为此目的创建一个模块,仅将其自身公开为权限管理实用程序。

一旦你弄清楚了上面的授权部分,DNN 将使用你的表单 cookie 来处理身份验证(即自动处理 AJAX 场景),或者通过基本或摘要式身份验证(对于非 AJAX 场景)。也就是说,如果您使用的是非 AJAX,则需要找出一种方法来仅在防伪令牌适用时对其进行验证。

于 2013-04-17T13:19:19.720 回答
5

DNN 中的服务框架就是您所追求的。它允许您提供直接插入 DNN 安全性的 REST API。

以下是一些帮助您入门的文章:

请注意,使用服务框架时,DNN 6 和 DNN 7 存在一些差异:

于 2013-04-17T09:06:38.553 回答
2

只是想注意 DnnModuleAuthorize 属性采用 PermissionKey 参数来自定义权限,因此您可以执行以下操作:

    [DnnModuleAuthorize(PermissionKey = "DELETEDATA")]
    [HttpPost]
    public HttpResponseMessage DeleteData(FormDataCollection data)

看起来您无法提供自己的错误消息,因此您可以像这样包装您的方法主体并省略自定义权限属性:

    [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.View)]
    [HttpPost]
    public HttpResponseMessage DeleteData(FormDataCollection data)
    {
        var errorMessage = "Could not delete data";

        if (ModulePermissionController.HasModulePermission(ActiveModule.ModulePermissions,"DELETEDATA"))
        {
            // do stuff here
        }
        else
        {
            errorMessage = "User does not have delete permission";
        }

        var error = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content =
                new StringContent(
                errorMessage)
        };
        return error;
    }
于 2014-09-16T17:55:15.110 回答
2

只是想添加到@Richards 评论以使用[DnnModuleAuthorize(PermissionKey = "DELETEDATA")]自定义权限。

完整的属性应该是:

[DnnModuleAuthorize(PermissionKey = "DELETEDATA", AccessLevel = SecurityAccessLevel.Edit)]

将其留空,如下所示:https ://github.com/dnnsoftware/Dnn.Platform/blob/f4a5924c7cc8226cfe79bbc92357ec1a32165ada/DNN%20Platform/Library/Security/Permissions/PermissionProvider.cs#L810

于 2015-06-03T23:03:01.893 回答