Как сохранить RoleProvider от переопределения пользовательских ролей? - PullRequest
2 голосов
/ 13 ноября 2009

У меня есть пользовательский поставщик ролей, который получает роли, к которым принадлежит пользователь, из базы данных. У меня также есть специальный модуль аутентификации, зарегистрированный в httpModules моего web.config, который отслеживает входящие HTTP-запросы и (если это подписанный запрос OAuth) устанавливает свойство HttpContext.Current.User для олицетворения пользователя, а установленный им IPrincipal включает в себя все роли пользователя, плюс дополнительная, называемая «делегированная».

Проблема в том, что после того, как я установил свой собственный IPrincipal, по-видимому, ASP.NET по-прежнему вызывает мой поставщик пользовательских ролей, а затем сбрасывает IPrincipal с тем, у которого есть только стандартные роли для этого пользователя.

Если я установлю <roleManager enabled="false" ...> в моем файле web.config, назначенные роли модуля аутентификации останутся неизменными. Хотя, очевидно, я хочу лучшего из обоих миров. Как я могу использовать поставщика ролей, но «отменить» эффект поставщика ролей, когда мой модуль аутентификации примет решение?

1 Ответ

1 голос
/ 13 ноября 2009

Оказывается, что в методе Init модуля http аутентификации я могу найти RoleManager, а затем перехватить событие, которое дает мне право вето на то, выполняет ли оно свою основную работу:

    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();
        }
    }
...