3

在我的 MVC 4 Web API 项目中,我有一个自定义角色提供程序,它通过System.Web.Mvc.Authorize我的 Home 上的属性按设计工作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...
}

网络配置:

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

2 回答 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 有什么类。这可能会提示您哪里出错了。

于 2013-02-18T23:54:56.170 回答
0

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

于 2013-02-18T21:53:36.083 回答