API 可以从我的前端之外的其他路径访问-url

API is accessible from other routes than my frontend-url

我正在为我们公司开发实习生网络应用程序。因为它只是在我们公司使用,所以我们决定实施 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());
    }

一切都按预期工作,除了我可以从前端以外的其他页面访问数据。

如果您直接在浏览器中访问 url,Cors 将不会执行任何操作。如果你只想从你的应用程序访问你不能有普通的 windows 身份验证,因为正如你所说的每个人都可以访问它。

您可以做的是运行将您的前端应用程序作为一个特殊服务帐户,并在您的后端限制仅对此帐户的访问。

如果您的前端 运行 直接在浏览器中访问,并且您想访问 API,那么我怀疑是否有任何方法可以 "protect" API此外。 IE。如果用户可以使用 AJAX 通过您的网站访问,除非您添加一些魔法令牌,否则没有什么可以阻止他们直接访问,但由于它在浏览器中 运行ning,用户将始终能够直接向 API 模拟完全相同的请求。

P.S。为什么这是用户可以直接访问API的问题?显然他们有权做任何 API 允许的事情,但是如果你只想通过你自己的 GUI 做这件事,你将不得不在服务器端提供额外的安全层,它将使用它自己的服务帐户,正如我所描述的以上。