首页 > 解决方案 > API 可以从我的前端 URL 以外的其他路由访问

问题描述

我正在为我们公司开发一个实习生网络应用程序。因为它只是在我们公司使用,所以我们决定实现 windows 身份验证。问题是,如果我登录了,我可以用 api 打开一个新选项卡,然后我会得到数据。

我尝试为限制添加一些 cors 属性,但这对我也不起作用。

身份验证.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());
    }

一切都按预期工作,除了我可以从前端以外的另一个页面访问数据这一事实。

标签: c#asp.net-web-api2windows-authentication

解决方案


如果您直接在浏览器中访问 url,Cors 将不会做任何事情。如果您只想从您的应用程序进行访问,则无法进行普通的 Windows 身份验证,因为正如您所说,每个人都可以访问它。

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

如果您的前端直接在浏览器中运行,并且您想访问 API,那么我怀疑是否有任何方法可以额外“保护”API。即,如果用户可以使用 AJAX 通过您的站点进行访问,除非您添加一些魔术令牌,否则没有什么可以阻止他们直接执行此操作,但是由于它在浏览器中运行,因此用户将始终能够直接模拟对 API 的完全相同的请求.

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


推荐阅读