c# - System.Web.Http.AuthorizeAttribute 无法识别自定义角色提供者

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

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

在任何带有 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...
}

网络配置:

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

最佳答案

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

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

我不太熟悉 Web API,但我怀疑 RoleManagerModule 在属性触发时尚未运行,或者您尚未到达 PostAuthenticateRequest 事件,因为在那种情况下,模块会替换 Pricipal。

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

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

关于c# - System.Web.Http.AuthorizeAttribute 无法识别自定义角色提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945713/

相关文章:

c# - NuGet 不支持 packages.config

c# - 如何在 C# 中计算运行时数据成员的数量?

c# 列表查找重复更新多个列表

c# - 回发或回调参数无效。单击按钮

c# - 单元测试 Entity Framework 将连接字符串设置为 bin 目录而不是 App_Data

c# - 提交具体模型对象

c# - SwitchTo IFrame,其中 XPath 包含 id 的一部分

c# - ASP.NET MVC 路由 : Can I have an action name with a slash in it?

c# - 如何在 C# 中释放在 C++ 中分配的内存

asp.net-mvc - ASP.NET MVC : Returning unsecured response to submitted https form on unsecured page