Asp.net 如何防止RoleProvider覆盖自定义角色?

Asp.net 如何防止RoleProvider覆盖自定义角色?,asp.net,authorization,oauth,roles,Asp.net,Authorization,Oauth,Roles,我有一个自定义角色提供程序,可以从数据库中获取用户所属的角色。我还在web.config的httpModules中注册了一个自定义身份验证模块,该模块嗅探传入的HTTP请求,并(如果是OAuth签名的请求)设置HttpContext.Current.User属性来模拟用户,它设置的IPrincipal包括所有用户的角色,外加一个称为“委派”的额外角色 问题是,在我设置了自定义IPrincipal之后,显然ASP.NET仍然调用我的自定义角色提供程序,然后将IPrincipal重置为仅具有该用户标

我有一个自定义角色提供程序,可以从数据库中获取用户所属的角色。我还在web.config的httpModules中注册了一个自定义身份验证模块,该模块嗅探传入的HTTP请求,并(如果是OAuth签名的请求)设置HttpContext.Current.User属性来模拟用户,它设置的IPrincipal包括所有用户的角色,外加一个称为“委派”的额外角色

问题是,在我设置了自定义IPrincipal之后,显然ASP.NET仍然调用我的自定义角色提供程序,然后将IPrincipal重置为仅具有该用户标准角色的IPrincipal


如果我在web.config文件中设置了
,则身份验证模块分配的角色将保持不变。很明显,我想要两全其美。如何使用角色提供程序,但在我的身份验证模块决定使用时“取消”角色提供程序的效果?

事实证明,在身份验证http模块的Init方法中,我可以找到
角色管理器
,然后钩住一个事件,该事件赋予我对其是否执行覆盖工作的否决权:

    public void Init(HttpApplication context) {
        var roleManager = (RoleManagerModule)context.Modules["RoleManager"];
        roleManager.GetRoles += this.roleManager_GetRoles;
    }

    private void roleManager_GetRoles(object sender, RoleManagerEventArgs e) {
        if (this.application.User is OAuthPrincipal) {
            e.RolesPopulated = true; // allows roles set in AuthenticationRequest to stick.
        }
    }

    private void context_AuthenticateRequest(object sender, EventArgs e) {
        if (/*oauth request*/) {
            HttpContext.Current.User = CreateOAuthPrincipal();
        }
    }