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

本文关键字:角色 自定义 程序 识别 Web Http AuthorizeAttribute System | 更新日期: 2023-09-27 18:00:05

在我的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...
}

Web.config:

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

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

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

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

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

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

最后一种可能性是,在RoleManagerModule替换Principal之后,其他人正在替换它。如果可能,请临时删除System.Web.Http.AuthorizeAttribute,在控制器中设置断点,并确定Thread.CurrentPrincipal具有什么类。这可能会给你一个提示,告诉你哪里出了问题。

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