c# - 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());
}
一切都按预期工作,除了我可以从前端以外的另一个页面访问数据这一事实。
解决方案
如果您直接在浏览器中访问 url,Cors 将不会做任何事情。如果您只想从您的应用程序进行访问,则无法进行普通的 Windows 身份验证,因为正如您所说,每个人都可以访问它。
您可以做的是将您的前端应用程序作为一个特殊的服务帐户运行,并在您的后端限制对该帐户的访问。
如果您的前端直接在浏览器中运行,并且您想访问 API,那么我怀疑是否有任何方法可以额外“保护”API。即,如果用户可以使用 AJAX 通过您的站点进行访问,除非您添加一些魔术令牌,否则没有什么可以阻止他们直接执行此操作,但是由于它在浏览器中运行,因此用户将始终能够直接模拟对 API 的完全相同的请求.
PS 为什么这是用户可以直接访问 API 的问题?显然他们有权做任何 API 允许的事情,但是如果你只想通过你自己的 GUI 来做这件事,你将不得不在服务器端提供额外的安全层,就像我上面描述的那样,它将使用它自己的服务帐户。
推荐阅读
- angular - 用户名和密码在开发人员工具的网络选项卡上显示为纯文本
- c# - 服务参考适用于某些计算机但不是全部,出现我不理解的错误
- regex - 提取模式之间的内容
- webrtc - 使用 Janus 直播网络摄像头
- excel - 如何调用图表以插入新创建的 Word Doc
- python - 为什么我的表单反序列化为 Mutlidict 字符串而不是烧瓶中的整数
- python - 将所有 MatLab 工作区变量转换为 Python 变量
- python-3.x - 如何使用 python3 获取 .csv 文件的最后一行?
- mysql - 似乎无法将 REPLACE INTO 与 WHERE EXISTS 一起使用
- java - 无法将元素添加到 ArrayList