我在我的IIdentity
申请中通过IPrincipal
使用自定义ASP.NET MVC
和EF 4.3
作为已审核here(并按照已接受答案的解决方案)。另外,我有一个自定义RoleProvider
。 在本地(使用IIS Express
),它目前正常工作。但是现在,当我在真实主机上上传应用程序时,似乎所有用户都处于"admin"
角色!例如我创建的用户不在角色"admin"
中,但可以访问所有受保护的页面(需要"admin"
角色)。例如Role.IsUserInRole
始终返回true
。你有什么想法吗?你能帮助我吗?我应该在IIS
中进行任何设置吗?
答案 0 :(得分:5)
我解释了这个解决方案,它对我有用。我现在不行,可能你应该回滚到AuthenticateRequest
事件。如果你想这样做,你必须从你的项目中完全删除RoleManagerModule
。试试这个,让我知道是否有效:
// in your module:
public void Init(HttpApplication context) {
_application = context;
// rollback this line:
_application.AuthenticateRequest += ApplicationAuthenticateRequest;
}
// and in web.config
<!-- in system.web section: -->
</system.web>
<!-- other stufs -->
<httpModules>
<remove name="RoleManager"/>
</httpModules>
</system.web>
<!-- and in system.webServer section: -->
<system.webServer>
<!-- other stufs -->
<modules runAllManagedModulesForAllRequests="true">
<remove name="RoleManager"/>
</modules>
<system.webServer>
答案 1 :(得分:0)
如果您想继续使用默认的RoleManager,那就很难了。我尝试通过派生默认值来创建我自己的RoleManager,没有任何运气。 经过两天的尝试,我最终为RolePrincipal创建了一些扩展方法:
public static bool IsEmployee(this RolePrincipal principal)
{
if (IsAuthenticated())
return principal.IsInRole("Employee");
return false;
}
public static bool IsAdmin(this RolePrincipal principal)
{
if (IsAuthenticated())
return principal.IsInRole("Admin");
return false;
}
创建了一个新的WebViewPage类:
public abstract class BaseViewPage : WebViewPage
{
public virtual new RolePrincipal User
{
get
{
if (base.User == null)
return null;
return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
}
}
}
public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
public virtual new RolePrincipal User
{
get
{
if (base.User == null)
return null;
return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
}
}
}
修改了views文件夹中的web.config:
<pages pageBaseType="MyCompany.MyProject.BaseViewPage">
我的所有控制器都来自我的BaseController:
public abstract class BaseController : Controller
{
protected virtual new RolePrincipal User
{
get { return HttpContext.User as RolePrincipal; }
}
}
缺点是这些方法每次调用时都会查询我的数据库。 我正在使用MVC 4 btw
希望这有助于任何人