Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dotnetnuke 如何在基于DNN的web API上处理安全性/身份验证_Dotnetnuke_Restful Authentication - Fatal编程技术网

Dotnetnuke 如何在基于DNN的web API上处理安全性/身份验证

Dotnetnuke 如何在基于DNN的web API上处理安全性/身份验证,dotnetnuke,restful-authentication,Dotnetnuke,Restful Authentication,我正在使用DNN基于MVC的服务框架为DotNetNuke 6网站构建RESTAPI。然而,我在身份验证方面没有任何背景,所以我甚至不知道从哪里开始 基本上,我们希望我们的客户能够对其门户数据发出GET请求,并且我们希望一些客户(但不是所有客户)能够对其用户数据发布简单的更新 我一直在尝试搜索信息,但问题是我不确定我在搜索什么。DNN有不同的登录名和角色,但我不确定他们是否或如何参与。我听说过oAuth之类的东西,但我对它的理解是最基本的。我不知道这是否是我所需要的,也不知道它是否适用于DNN。

我正在使用DNN基于MVC的服务框架为DotNetNuke 6网站构建RESTAPI。然而,我在身份验证方面没有任何背景,所以我甚至不知道从哪里开始

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

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

更新: 根据以下关于将其与模块和进一步研究联系起来的答案,我做了以下工作:

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

它似乎既可以使用web浏览器(基于我登录的DNN帐户),也可以使用php脚本发送带有帐户用户名/密码的HTTP请求

“授权”属性:

    [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;
    }
使用DotNetNuke.Entities.Modules;
使用DotNetNuke.Entities.Portals;
使用DotNetNuke.Security;
使用DotNetNuke.Security.Permissions;
使用System.Web;
公共类MyAuthorize:DotNetNuke.Web.Services.AuthorizeAttributeBase
{
公用常量字符串AuthModuleFriendlyName=“MyAuthModule”;
public const string GETPermission=“APIGET”;
public const string POSTPermission=“APIPOST”;
公共字符串权限{get;set;}
受保护的覆盖bool AuthorizeCore(HttpContextBase上下文)
{
ModuleControl mc=新的ModuleControl();
ModuleInfo mi=mc.GetModuleByDefinition(PortalController.GetCurrentPortalSettings().PortalId,AuthModuleFriendlyName);
ModulePermissionCollection permCollection=mi.ModulePermissions;
返回ModulePermissionController.HasModulePermission(permCollection,Permission);
}
}
控制员: (“mytest”是GET和POST的端点)

公共类MyController:DnnController
{
[ActionName(“mytest”)]
[接受动词(HttpVerbs.Get)]
[DnnAuthorize(AllowAnonymous=true)]
[MyAuthorize(Permission=MyAuthorize.GETPermission)]
公共字符串myget(字符串id=“”)
{
返回“您已获得我的许可”;
}
[ActionName(“mytest”)]
[接受动词(HttpVerbs.Post)]
[DnnAuthorize(AllowAnonymous=true)]
[MyAuthorize(权限=MyAuthorize.POSTPermission)]
公共字符串mypost(字符串id=“”)
{
返回“您已获得我的发布许可”;
}
}

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

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

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


将DNN服务框架中的服务绑定到DNN权限的主要方法是将权限与模块实例相关联。也就是说,您将要求服务的用户识别他们从/关于哪个模块调用(通过在请求[标题、查询字符串、cookies、表单]中发送ModuleId和TabId),然后您可以指示他们在该模块上需要什么权限来对服务执行特定操作

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

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

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


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

只想注意,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;
    }

只想在@Richards注释中添加使用自定义权限的
[DnnModuleAuthorize(PermissionKey=“DELETEDATA”)]

完整属性应为:

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

将其留空不起任何作用,如图所示:

请检查这可能会有所帮助,我已经找到了解决方法