API доступен из других маршрутов, кроме моего внешнего интерфейса - PullRequest
0 голосов
/ 22 мая 2019

Я разрабатываю интернет-приложение для нашей компании.Поскольку он используется только в нашей компании, мы решили внедрить проверку подлинности Windows.Проблема в том, что если я вошел в систему, я могу просто открыть новую вкладку с API и я получу данные.

Я пытался добавить атрибут cors для ограничения, но у меня это тоже не сработало.

Authentication.cs:

[HttpGet]
    [Route("login")]
    public IHttpActionResult AuthenticateUser() {
      return GetHttpActionResult(() => {
        WindowsPrincipal user = RequestContext.Principal as WindowsPrincipal;

        if (user != null) {
          return _viewModelFactory.CreateEmployeeViewModel(_timeTrackingPersistenceManager.GetEmployeeByUserName(User.Identity.Name));
        } else {
          return Content(HttpStatusCode.Unauthorized, "This user cannot be logged in");
        }
      });
    }

WebApiConfig.cs:

public static void Register(HttpConfiguration config) {
      config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

      // Web API routes
      config.MapHttpAttributeRoutes();

      config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

      ConfigureCors(ref config);
    }

    public static void ConfigureCors(ref HttpConfiguration config) {
      string frontendAddress = "";

#if DEBUG
      frontendAddress = ConfigurationManager.AppSettings["frontendPathLocal"];
#elif !DEBUG
      frontendAddress = ConfigurationManager.AppSettings["frontendPathServer"];
#endif
      var cors = new EnableCorsAttribute(frontendAddress, "*", "*") { SupportsCredentials = true };
      config.EnableCors(cors);

      config.Filters.Add(new AuthorizeAttribute());
    }

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

1 Ответ

1 голос
/ 22 мая 2019

Cors не будет ничего делать, если вы обращаетесь к URL-адресу прямо в браузере.Если вы хотите получить доступ только из своего приложения, у вас не может быть обычной аутентификации Windows, поскольку, как вы говорите, все имеют к ней доступ.

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

Если ваш веб-интерфейс работает непосредственно в браузере и вы хотите получить доступ к API, то я сомневаюсь, что есть какой-либо способ дополнительно "защитить" API.Т.е. если у пользователя есть доступ через ваш сайт с помощью AJAX, ничто не мешает ему делать это напрямую, если вы не добавите какой-нибудь магический токен, но, поскольку он работает в браузере, пользователь всегда сможет эмулировать точно такой же запрос к API напрямую.

PS Почему эта проблема связана с тем, что пользователи могут напрямую обращаться к API?Очевидно, у них есть права делать все, что позволяет API, но если вы хотите сделать это ТОЛЬКО через собственный графический интерфейс, вам придется обеспечить дополнительный уровень безопасности на стороне сервера, который будет использовать свою собственную учетную запись службы, как я описал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...