Mys*_*per 8 dotnetnuke restful-authentication
我正在为DotNetNuke 6网站构建REST API,利用DNN基于MVC的服务框架.但是,我没有任何身份验证背景,所以我甚至不确定从哪里开始.
基本上,我们希望我们的客户能够对其门户网站的数据进行GET请求,并且我们希望一些客户端(但不是所有客户端)能够对其用户数据发布简单更新.
我一直在努力寻找信息,但问题是我不确定我在寻找什么.DNN有不同的登录和角色,但我不确定他们是否或如何参与.我听说过像oAuth这样的事情,但我对它的理解是最基本的.我不知道这是否是我需要的,以及它是否或如何适用于DNN.谁能指出我正确的方向?
更新:根据以下答案,将其与模块和进一步的研究结合起来,这就是我所做的:
我为这项服务创建了一个模块,我为它添加了两个特殊权限:"APIGET"和"APIPOST".我将这些分配给了DNN中的一些测试角色/测试帐户.我编写了一个自定义authorize属性,给定模块ID,检查当前用户是否具有必要的权限(通过角色或直接).据我所知,标签ID在我的情况下是无关紧要的.
它似乎既可以使用Web浏览器(基于我登录的DNN帐户),也可以使用php脚本发送带有帐户用户名/密码的HTTP请求.
授权属性:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:("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";
}
}
Run Code Online (Sandbox Code Playgroud)
将DNN Services Framework中的服务绑定到DNN权限的主要方式是将权限与模块实例相关联.也就是说,您将要求您的服务用户识别他们正在/关于哪个模块(通过在请求中发送ModuleId和TabId [header,query-string,cookies,form]),然后您可以指明哪些权限他们需要在该模块上对服务采取特定措施.
您可以SupportedModules在服务上使用该属性,并传入逗号分隔的模块名称列表,以确保只允许您自己的模块.然后,DnnModuleAuthorize在服务或单个操作级别添加属性,以说明用户在该模块上需要的权限.在您的实例中,您还可以在操作AllowAnonymous上添加属性GET,并DnnModuleAuthorize在服务上添加一个POST方法(以及其他任何内容).请注意,您不能将该AllowAnonymous属性放在控制器上; 它将覆盖在操作中放置的授权,从而无法使操作更具限制性.
您还需要ValidateAntiForgeryToken在POST操作上添加属性,以防止CSRF攻击.
如果您没有自然将其权限与服务相关联的模块,则可以仅为此目的创建一个模块,仅将其自身公开为权限管理实用程序.
一旦你弄清楚上面的授权部分,DNN将使用你的表单cookie来处理身份验证(即自动处理AJAX场景),或者通过基本或摘要身份验证(对于非AJAX场景).也就是说,如果您正在进行非AJAX,那么只有在适用时才需要找到验证防伪令牌的方法.
小智 5
DNN中的服务框架就是您所追求的.它允许您提供可直接插入DNN安全性的REST API.
以下是一些可以帮助您入门的文章:
请注意,使用服务框架时,DNN 6和DNN 7存在一些差异:
| 归档时间: |
|
| 查看次数: |
8196 次 |
| 最近记录: |