Как установить роль по умолчанию для нового пользователя, использующего проверку подлинности Windows с помощью SqlRoleProvider?

У меня есть приложение, которое использует проверку подлинности Windows и SqlRoleProvider для проверки подлинности пользователя и управления ролями соответственно. Он отлично работает с моими тестовыми пользователями, которых я добавил в базу данных по умолчанию. Приложение требует, чтобы пользователи вошли в систему (используя учетные данные Windows), а затем могли использовать это внутреннее приложение в качестве основного «пользователя». Если пользователю необходимо добавить роль высокого уровня, администратор будет нести ответственность за это после первого входа в систему.

С учетом сказанного, как мне добавить пользователя к роли по умолчанию при первом входе в систему? Логически я знаю, что мне нужно будет вызвать Roles.IsUserInRole(), а затем добавить их, если это не так; однако, где бы я это сделал? У меня возникли проблемы с определением того, какое событие в Global.asax использовать.

Спасибо

EDIT: Чтобы немного расширить сценарий, я не использую систему поставщиков с полным членством из-за требований к написанию новых поставщиков, позволяющих хранить строку подключения за пределами web.config. Я не использую какую-либо форму регистрации или страницы входа и позволяю встроенной аутентификации Windows в IIS обрабатывать аспекты аутентификации, в то время как мой расширенный SqlRoleProvider управляет ролями пользователей. Система работает нормально для пользователей, которым я настроил роли с помощью жестко закодированных тестов. Я просто ищу способ добавить новых пользователей (которые будут аутентифицированы IIS), которые будут немедленно добавлены к роли «Пользователи» по умолчанию. Я думаю, что нашел его; однако сейчас я изучаю способы сделать так, чтобы он не срабатывал при каждом запросе из соображений производительности.


person JamesEggers    schedule 09.12.2008    source источник


Ответы (3)


Я смог найти решение после того, как немного покопался и поиграл. Я добавил следующий код в свой файл Global.asax, и он выполняет то, на что я надеюсь.

protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)
{
    if (!Roles.IsUserInRole(e.Identity.Name, "Users"))
    {
        Roles.AddUsersToRole(new string[] { e.Identity.Name }, "Users");
    }
}

Я обеспокоен, так как этот код срабатывает при каждом запросе страницы. Есть ли лучший способ ограничить, когда это происходит? Должен ли я просто добавить этот код в событие page_load целевой страницы вместо Global.asax?

person JamesEggers    schedule 09.12.2008

Я бы добавил пользователю роль по умолчанию сразу после того, как пользователь был получен.

Что-то типа такого:

user = Membership.GetUser()
if (user != null)
{
  // default role 
  string[] defaultRoles = {"MyRole"};

  AddUsersToRoles(user, defaultRoles); 

}
person CheGueVerra    schedule 09.12.2008

Почему бы не поставить его при входе или регистрации?

При входе в систему обработайте это событие и вставьте его. Проверяйте каждый раз, когда они входят в систему.

person masfenix    schedule 09.12.2008
comment
Поскольку я использую проверку подлинности Windows, WindowsAuthentication_OnAuthenticate будет событием входа в систему и будет срабатывать при каждом запросе на основе WindowsAuthenticationModule. В настоящее время я не использую ни форму входа, ни дополнительную регистрационную форму. Я не использую членство; только роли. - person JamesEggers; 10.12.2008