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 做这件事,你将不得不在服务器端提供额外的安全层,它将使用它自己的服务帐户,正如我所描述的以上。
我正在为我们公司开发实习生网络应用程序。因为它只是在我们公司使用,所以我们决定实施 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 做这件事,你将不得不在服务器端提供额外的安全层,它将使用它自己的服务帐户,正如我所描述的以上。