Вы всегда можете потребовать, чтобы клиент прошел аутентификацию, используя HTTP Basic Auth или какую-либо другую пользовательскую схему. Если ваш клиент требует, чтобы пользователь вошел в систему, вы можете, по крайней мере, запретить пользователям получать URL-адрес www.companyA.com/services/service1.ashx
, так как они должны будут войти в систему, чтобы узнать об этом.
Сложнее, если вы также пытаетесь защитить URL-адрес от непреднамеренного использования людьми, которые законно имеют доступ к официальному клиенту. Вы можете попытаться регулярно менять служебный пароль и обновлять клиент вместе с ним. Таким образом, обновление клиента в браузере приведет к извлечению нового пароля, но любой, кто создал собственный код, устарел. Конечно, действительно целеустремленный пользователь может просто написать код для программного извлечения пароля из клиентского JS при его изменении, но вы по крайней мере защитите себя от случайных нарушителей.
Что касается идеи токена URL, которую вы упомянули в обновлении 2, она может работать примерно так. Представьте, что каждый месяц для работы URL-адреса www.companyA.com/services/service1.ashx
требуется новый токен, например, www.companyA.com/services/service1.ashx?token=January
. Когда наступит февраль, «январь» перестанет работать. Сервер должен знать, чтобы принимать только текущий месяц, и клиент должен знать, чтобы отправить токен (определяется в момент загрузки веб-страницы клиента с сервера в браузере)
(Весь псевдокод, так как я не знаю C # и какую среду JS вы будете использовать)
Код на стороне сервера:
if (request.urlVars.token == Date.now.month) then
render "This is the real data: [2,5,3,5,3]"
else
render "401 Unauthorized"
Код клиента (динамическая версия, обслуживаемая вашим сервисом)
www.companyA.com/client/myajaxcode.js.asp
var dataUrl = 'www.companyA.com/services/service1.ashx?token=' + <%= Date.now.month %>
// below is JS code that does ajax call using dataUrl
...
Так что теперь у нас есть сервисный код, который будет принимать только текущий месяц в качестве токена, и клиентский код, который при обновлении в браузере получает последний токен (динамически устанавливается как текущий месяц). Так как эта схема действительно предсказуема и может быть взломана, оставшимся шагом является соленый хэш токена, чтобы никто не мог догадаться, каким он будет.
if (request.urlVars.token == mySaltedHashMethod(Date.now.month)) then
и
var dataUrl = 'www.companyA.com/services/service1.ashx?token=' + <%= mySaltedHashMethod(Date.now.month) %>
Из-за этого у вас будет URL типа www.companyA.com/services/service1.ashx?token=gy4dc8dgf3f
, и каждый месяц будет меняться токен.
Вы, вероятно, хотели бы также истечь быстрее, чем каждый месяц, что вы могли бы сделать, используя час эпохи вместо месяца.
Мне было бы интересно узнать, решил ли кто-нибудь это с помощью какого-то зашифрованного клиентского кода!