Dotnetnuke 如何在基于DNN的web API上处理安全性/身份验证
我正在使用DNN基于MVC的服务框架为DotNetNuke 6网站构建RESTAPI。然而,我在身份验证方面没有任何背景,所以我甚至不知道从哪里开始 基本上,我们希望我们的客户能够对其门户数据发出GET请求,并且我们希望一些客户(但不是所有客户)能够对其用户数据发布简单的更新 我一直在尝试搜索信息,但问题是我不确定我在搜索什么。DNN有不同的登录名和角色,但我不确定他们是否或如何参与。我听说过oAuth之类的东西,但我对它的理解是最基本的。我不知道这是否是我所需要的,也不知道它是否适用于DNN。谁能给我指出正确的方向吗 更新: 根据以下关于将其与模块和进一步研究联系起来的答案,我做了以下工作: 我为这个服务创建了一个模块,并为它添加了两个特殊权限:“APIGET”和“APIPOST”。我将它们分配给了DNN中的一些测试角色/测试帐户。我编写了一个自定义authorize属性,在给定模块ID的情况下,该属性检查当前用户是否具有必要的权限(通过角色或直接)。据我所知,标签ID在我的情况下是不相关的 它似乎既可以使用web浏览器(基于我登录的DNN帐户),也可以使用php脚本发送带有帐户用户名/密码的HTTP请求 “授权”属性:Dotnetnuke 如何在基于DNN的web API上处理安全性/身份验证,dotnetnuke,restful-authentication,Dotnetnuke,Restful Authentication,我正在使用DNN基于MVC的服务框架为DotNetNuke 6网站构建RESTAPI。然而,我在身份验证方面没有任何背景,所以我甚至不知道从哪里开始 基本上,我们希望我们的客户能够对其门户数据发出GET请求,并且我们希望一些客户(但不是所有客户)能够对其用户数据发布简单的更新 我一直在尝试搜索信息,但问题是我不确定我在搜索什么。DNN有不同的登录名和角色,但我不确定他们是否或如何参与。我听说过oAuth之类的东西,但我对它的理解是最基本的。我不知道这是否是我所需要的,也不知道它是否适用于DNN。
[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
以下是一些帮助您入门的文章:
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)]
将其留空不起任何作用,如图所示:请检查这可能会有所帮助,我已经找到了解决方法