4

我正在使用自定义IIdentityIPrincipal在我的ASP.NET MVC应用程序中通过EF 4.3这里解释并遵循接受的答案的解决方案)。另外,我有一个自定义RoleProvider. 在本地(使用IIS Express),它可以正常工作。但是现在,当我在真实主机上上传应用程序时,似乎所有用户都在"admin"起作用!例如,我创建了一个不在角色中的用户"admin",但它可以访问所有受保护的页面(需要"admin"角色)。例如Role.IsUserInRole总是返回true。请问你有什么想法吗?你能帮助我吗?有什么我应该做的设置IIS吗?

4

2 回答 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 回答