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

时间:2013-02-18 21:37:06

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

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

在任何System.Web.Http.ApiController System.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>

2 个答案:

答案 0 :(得分:2)

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

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

我并不熟悉Web API,但我怀疑RoleManagerModule在该属性触发时尚未运行,或者您还没有到达PostAuthenticateRequest事件,因为在那种情况下,Module取代了Pricipal。 / p>

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

最后一种可能性是,在RoleManagerModule这样做之后,其他人正在替换Principal。如果可能,暂时删除System.Web.Http.AuthorizeAttribute,在控制器中设置断点,并确定Thread.CurrentPrincipal具有的类。这可能会给你一个关于它出错的提示。

答案 1 :(得分:0)

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

相关问题