gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:06:56 24 4
gpt4 key购买 nike

在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com