【问题标题】:System.Web.Http.AuthorizeAttribute not recognizing custom role providerSystem.Web.Http.AuthorizeAttribute 无法识别自定义角色提供程序
【发布时间】:2013-04-05 15:54:59
【问题描述】:

在我的 MVC 4 Web API 项目中,我有一个自定义角色提供程序,它通过我的主页 System.Web.Mvc.Controller 上的 System.Web.Mvc.Authorize 属性按设计工作。

在任何 System.Web.Http.ApiControllerSystem.Web.Http.Authorize 上,自定义角色提供程序永远不会被调用,总是返回 false。有没有办法指定 Web API AuthorizeAttribute 选择我的自定义角色提供程序,如 MVC AuthorizeAttribute?

角色提供者:

public class CustomRoleProvider : RoleProvider
{        
    //Overriden methods
    public override string[] GetRolesForUser(string username)
    {
        //Always return "Master" for testing purposes
        return new string[] { "Master" };
    }

    public override bool IsUserInRole(string username, string roleName)
    {
        //Always return true for testing purposes
        return true;
    }

    //Other overridden method stubs...
}

Web.config:

<roleManager defaultProvider="CustomRoleProvider" enabled="true" cacheRolesInCookie="false" >
  <providers>
    <clear />
    <add name="CustomRoleProvider" type="MyApp.SecurityExtensions.CustomRoleProvider, MyApp" />
  </providers>
</roleManager>

【问题讨论】:

  • 它只从 MVC 控制器中命中它。使用 [System.Web.Http.Authorize(Roles = "Master")] 立即从 API 控制器评估为 false
  • 我会关闭缓存进行测试...
  • Cookies 每次会话都会过期,所以我刚刚关闭了浏览器,但如果我在调试时忘记关闭浏览器,这仍然是一件好事。我更新了 OP 以反映关闭缓存

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


【解决方案1】:

这不是一个真正的答案,但这可能会有所帮助:

这两个属性都通过查询当前主体来工作。 MVC 属性使用 HTTPContent.User,而 System.Web.http 版本使用 Thread.CurrentPrincipal,但差别不大。

我对 Web API 不是很熟悉,但我怀疑 RoleManagerModule 在属性触发时没有运行,或者您还没有到达 PostAuthenticateRequest 事件,因为在那种情况下模块替换了 Pricipal。

您确定您的 WebAPI 使用需要某种形式的 ASP 身份验证吗?如果您没有将 WebAPI 项目配置为需要某种形式的身份验证,那么显然您将永远无法到达 PostAuthenticateRequest 事件,因此 RoleManagerModule 将永远不会启动。

想到的最后一种可能性是,在 RoleManagerModule 这样做之后,其他东西正在替换 Principal。如果可能,暂时删除 System.Web.Http.AuthorizeAttribute,在控制器中设置断点,并确定 Thread.CurrentPrincipal 有什么类。这可能会提示您哪里出错了。

【讨论】:

  • 我的客户端使用的第三方身份验证库在使用 IPrincipal 接口后没有费心去实现bool IsInRole(string role) 方法。您关于是否有东西取代校长的建议让我走上了正确的轨道
【解决方案2】:

您需要对 Web API 的控制器使用 System.Web.Http.AuthorizeAttribute。示例:http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/

【讨论】:

  • 我之前已经浏览过该帖子,但为什么我必须扩展 AuthorizeAttribute 才能使其与 API 控制器一起使用?我可以看到System.Web.Security.RolePrincipal 正确设置了ProviderName
  • 只是为了澄清,正如您在 OP 上的 cmets 中看到的那样,我回复了一条评论,该评论随后被删除,我在 ApiController 上使用 System.Web.Http.AuthorizeAttribute 而不是 System.Web.Mvc.AuthorizeAttribute。我将更新 OP 以明确这一点。谢谢
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 2011-05-23
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多