我正在使用自定义IIdentity
并IPrincipal
在我的ASP.NET MVC
应用程序中通过EF 4.3
这里解释(并遵循接受的答案的解决方案)。另外,我有一个自定义RoleProvider
. 在本地(使用IIS Express
),它可以正常工作。但是现在,当我在真实主机上上传应用程序时,似乎所有用户都在"admin"
起作用!例如,我创建了一个不在角色中的用户"admin"
,但它可以访问所有受保护的页面(需要"admin"
角色)。例如Role.IsUserInRole
总是返回true
。请问你有什么想法吗?你能帮助我吗?有什么我应该做的设置IIS
吗?
问问题
2715 次
2 回答
4
我解释了这个解决方案,它对我有用。我现在没有,可能你应该回滚到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>
于 2012-06-12T20:08:01.527 回答
0
如果你想继续使用默认的 RoleManager,那就很难了。我尝试通过从默认值派生来创建自己的 RoleManager,但没有任何运气。经过 2 天的尝试,我最终为 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 顺便说一句
希望这对任何人都有帮助
于 2013-05-12T09:32:34.267 回答