System.Web.Http.AuthorizeAttribute无法识别自定义角色提供程序

3
在我的MVC 4 Web API项目中,我有一个自定义角色提供程序,通过System.Web.Mvc.Authorize属性在我的Home System.Web.Mvc.Controller上正常工作。
对于任何带有System.Web.Http.AuthorizeSystem.Web.Http.ApiController,自定义角色提供程序从未被调用,始终返回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控制器中触发。在API控制器中使用[System.Web.Http.Authorize(Roles = "Master")]会立即评估为false。 - chrisjsherm
我会关闭缓存进行测试... - leastprivilege
Cookies在每个会话中都会过期,所以我一直在关闭浏览器,但这仍然是一个好的建议,以防我在调试时忘记关闭浏览器。我更新了原始帖子以反映关闭缓存。 - chrisjsherm
2个回答

2

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

这两个属性都通过查询当前负责人来工作。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)方法。你提出的建议是检查是否有东西替换了主体,让我找对了方向。 - chrisjsherm

0

我之前已经浏览过那篇文章,但为什么我必须扩展AuthorizeAttribute才能使其与API控制器一起工作呢?我可以看到System.Web.Security.RolePrincipal正确地设置了ProviderName。 - chrisjsherm
只是为了澄清,在原帖的评论中可以看到,我回复了一条随后被删除的评论,说明我在我的ApiController上使用的是System.Web.Http.AuthorizeAttribute而不是System.Web.Mvc.AuthorizeAttribute。我会更新原帖以澄清这一点。谢谢。 - chrisjsherm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接