2015-06-13 2 views
0

У меня есть следующие услуги домена:Должен ли я делать авторизацию в своих доменных службах?

pulic void DeleteCustomer(int customerId, string userIdentity, string userPassword) 
{ 
    //1º Do login operation to verify if the credentials are valid. 

    customerRepository.DeleteById(customerId); 
} 

Давайте предположим, что я потребляя этот код ASP.NET MVC или Windows Forms приложение, которое имеет окно входа в систему.

Логин будет снова проверен в каждой операции, тратя ресурсы.

Скажем, я изменить его на:

pulic void DeleteCustomer (int customerId, int requestUserId) 
{ 
    //1º Trust that requestUserId is valid. 

    //Do something with the requestUserId (e.g Set the UserId that deleted the customer) 

    customerRepository.DeleteById(customerId); 
} 

В этом случае операция Логин будет сделано в ASP.NET MVC ИЛИ Windows Forms приложений только один раз, но любой абонент может пройти любой requestUserId, оставляя страшная дыра в безопасности.

ответ

2

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

От defensive programming перспектива, каждый метод должен уметь защищаться от недействительных или поддельных входов, что также применимо в этом случае.

С REST безгосударственной точки зрения, каждый запрос должен быть изолированной друг от друга, что означает, что каждый запрос должен нести всю необходимую информацию, не полагаясь на предыдущих запросах и там даже не должна быть состоянием сервера. По этой причине все запросы должны быть авторизованы независимо.

Кроме того, авторизация является сквозной проблемой, вы должны рассмотреть возможность написания вашего кода авторизации в качестве атрибута.

+0

Hi @Khanh TO. Я согласен с вами в отношении перспектив перспективного программирования. В моем случае каждая авторизация будет запрашивать базу данных, то есть если вы используете службу из ASP.NET MVC, пользователь выполнит вход в систему (первая авторизация). Когда пользователь вызывает действие, это будет другой авторизацией. Если это действие вызывает пять методов в службе, будет более пяти ударов по базе данных для выполнения той же авторизации, будет выполнено 6 запросов без необходимости. –

+1

@Vinicius Gonçalves: с указанием asp.net mvc вы указали, что информация о зарегистрированном пользователе должна содержать внутри зашифрованного билета. Когда сервер получает этот билет от клиента, сервер может расшифровать, чтобы получить информацию, не обращаясь к БД. –

+1

@Vinicius Gonçalves: В случае авторизации, я думаю, нам обычно нужно защищать «точки входа» бэкэнд-сервиса. Если точки входа - это методы действия asp.net mvc, возможно, нам придется это учитывать. Но если вы развертываете службы домена в качестве другого уровня, они станут точками входа и нуждаются в защите. –

3

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

+0

Hi Kayess, На мой настоящий код я это делаю. но я не уверен в производительности. –

Смежные вопросы