Как сделать атрибут [Авторизовать] более гибким?

У меня есть приложение MVC 5, которое я блокирую, разрешая только определенным пользователям, прошедшим проверку подлинности, доступ к определенным действиям в моем контроллере. Я использую атрибут авторизации в верхней части класса, позволяя только пользователям, которым я хочу получить доступ после входа в систему. Я делаю это со следующим атрибутом, размещенным в верхней части моего класса...

[Authorize(Users="user1,user2")]

Это отлично работает! Однако что, если я не хочу перекомпилировать и развертывать приложение каждый раз, когда хочу добавить нового пользователя к этому конкретному контроллеру?

Я подумал, что могу добавить это в свой файл web.config в качестве такого ключа...

<appSettings>
  <add users="user1,user2"/>
</appSettings>

Но когда я пытаюсь получить доступ к этому ключу в своем контроллере следующим образом: [Авторизация (Пользователи = ConfigurationManager.AppSettings ["пользователи"])] Я получаю сообщение об ошибке: Не удается разрешить символ «Настройки приложения».

Есть ли способ сделать это?


person user2146538    schedule 13.06.2014    source источник


Ответы (2)


Я не уверен, почему ответ, который не ответил на вопрос, был принят. Тем не менее, я подумал, что, возможно, стоит добавить ответ для будущих путешественников.

Хотя эта функциональность не предоставляется из коробки, ее, безусловно, можно реализовать, написав собственный атрибут авторизации.

public class ConfigAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var allowedUsers = ConfigurationManager.AppSettings["CoolActionAllowedUsers"];
        var allowedUsersArray = allowedUsers.Split(',');

        if (httpContext.User.Identity != null && allowedUsersArray.Contains(httpContext.User.Identity.Name))
        {
            return true;
        }

        return false;
    }
}

И использовать атрибут:

[ConfigAuthorize]
public ActionResult CoolAction() {
    //...
}

В приведенном выше коде, когда ваша авторизация выполняется в AuthorizeCore, значение конфигурации из CoolActionAllowedUsers будет загружено в память, и текущий аутентифицированный пользователь будет проверен, если он находится в списке разрешенных пользователей. Если вы внесете изменения в свой файл конфигурации, это не будет проблемой; пул приложений автоматически перезапустится, и при следующем запуске кода для чтения файла конфигурации будет прочитано ваше новое значение.

Я полностью согласен с @Shoe в том, что роли следует использовать. Управление списком пользователей в вашем коде — это просто боль в заднице. На самом деле, на работе каждый раз, когда я получаю запрос на доступ к странице только для одного случайного пользователя, я всегда требую настройки группы. Однако приведенный выше код может применяться и к списку ролей.

person Justin Helgerson    schedule 14.06.2014
comment
спасибо за ответ, это действительно отвечает на мой вопрос. Хотя я согласен на 100% с рекомендацией Shoe, представленной как передовая практика; то, что я часто вижу здесь, в Stackoverflow, — это мнение респондентов, затмевающее то, что на самом деле спрашивает пользователь. У всех нас есть право на собственное мнение, но часто есть законная причина, по которой кто-то задает вопрос о том, как что-то сделать. При этом я дал вам обоим реквизиты для ваших соответствующих ответов. - person user2146538; 16.06.2014
comment
Мой ответ состоял в том, чтобы дать то, что нужно, не обязательно то, что нужно. Ответ, который лучше подходит к вопросу о том, как вставить квадратный колышек в круглое отверстие? Очевидно, не используйте квадратный колышек, используйте круглый вместо него. Возьмите пилу, отрежьте колышек, отшлифуйте колышек, перекрасьте его, тогда он должен подойти. Этот ответ, безусловно, отвечает на вопрос, хотя я не понимаю, почему он когда-либо будет перенят, просто используя Roles - person James Sampica; 16.06.2014

Вместо использования параметра Users используйте параметр Roles.

[Authorize(Roles="CanExecuteActions")]

Теперь вы можете управлять тем, какие пользователи имеют доступ к вашему контроллеру, назначив им эту роль. Любой пользователь без роли не может выполнять какие-либо действия контроллера.

person James Sampica    schedule 13.06.2014
comment
Спасибо за ответ. Я уже знал, как это сделать. Что я ДЕЙСТВИТЕЛЬНО хотел знать, так это могу ли я сделать это так, как я задал в вопросе, но я собираюсь дать вам реквизит для ответа и принять это как «нет, это невозможно». - person user2146538; 14.06.2014
comment
Да, параметр users не очень полезен или масштабируем. Вы сэкономите много головной боли в долгосрочной перспективе с особой ролью. - person James Sampica; 14.06.2014