【问题标题】:dnn WebApi - DnnAuthorize methods not working?dnn WebApi - DnnAuthorize 方法不起作用?
【发布时间】:2014-06-09 19:35:16
【问题描述】:

我使用 web api 在 dnn 服务框架中创建了以下简单的 ping 方法。

[AllowAnonymous]
[HttpGet]
public HttpResponseMessage Ping()
{
    return Request.CreateResponse(HttpStatusCode.OK, "Pong!");
}

现在从浏览器调用它可以正常工作。如果然后尝试更改为这个

[DnnAuthorize]
[HttpGet]
public HttpResponseMessage Ping()
{
    return Request.CreateResponse(HttpStatusCode.OK, "Pong!");
}

我在浏览器中弹出用户名和密码请求。每次我输入详细信息时,登录框都会重新出现,好像它是错误的一样。

我也尝试过[DnnAuthorize(StaticRoles="Administrators")],但效果相同。

然后我下载了 Dnn Dash 服务源并加载了桌面应用程序项目。替换了以下行

string url = DnnRequest.GetUrl(credentials.HttpAlias, "DnnDash_SimpleDashboard", "Dash", "PingHost", false);            

string url = DnnRequest.GetUrl(credentials.HttpAlias, "RegisterService", "Register", "Ping", false);

这样它就可以在我的服务中使用上述方法。运行项目会导致 500 错误。

任何想法为什么我做错了?

编辑 1

我将 dnn dash 服务上传到我的网站,然后运行桌面应用程序。还是同样的问题,所以我至少知道这不是我的服务。

编辑 2

我清除了我的 dnn 日志,然后运行了几次桌面应用程序。回到日志并打开新创建的文件。找到以下一些与我运行桌面应用程序相匹配的条目。

[Thread:99][FATAL] DotNetNuke.Web.Common.Internal.DotNetNukeHttpApplication - System.Configuration.ConfigurationErrorsException: Password Retrieval is not enabled
at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

编辑 3

好的,EDIT 2 中的错误似乎是当您使用散列密码设置 dnn 站点时引起的。我切换到加密密码,现在我得到服务的回复说“未授权”。只需要弄清楚为什么管理员日志没有被授权。

注意:从散列密码切换到加密密码时,这只会影响新用户。对于现有用户,您需要运行 SQL 脚本来更新密码格式,并且您需要重置密码。

【问题讨论】:

  • 那么编辑 2 是否意味着您已经解决了问题?如果没有,请查看this DNN issue
  • 尝试使用 Fiddler 检查请求标头和来自服务器的响应,看看您是否解决了问题。
  • @Gaz83,如果您的编辑描述了您的解决方案,请随时回答您自己的问题。这将是其他用户的有用参考。
  • @SimonMᶜKenzie 不,我只是把它放在那里,这样人们就可以看到我采取的可能对他们有帮助的步骤。
  • @SimonMᶜKenzie 一旦解决,我将创建一个答案。即使我使用的是管理员登录详细信息,我仍然遇到授权问题。

标签: c# dotnetnuke asp.net-web-api


【解决方案1】:

我知道这个问题很老,但我遇到了类似的问题并且能够正确解决它。 要对请求授权管理员,您不能简单地传递一个字符串。原因是每个 dnn 实例很有可能管理员角色具有不同的名称,例如“Administrators”、“Administrator”(没有“s”)等。为了解决这个问题,这样写:

[HttpDelete, DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Admin)]

如果您需要在代码中的其他地方访问此角色名称,您可以使用这个 sn-p。

private string GetAdminRoleName()
    {
        return PortalSettings.AdministratorRoleName;
    }

希望对某人有所帮助。抱歉,回复晚了。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 2013-03-15
    • 2016-03-30
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2019-01-09
    相关资源
    最近更新 更多