取消/阻止Dot网核心的路由导航
本文关键字:路由 导航 核心 阻止 Dot 取消 | 更新日期: 2023-09-27 18:12:15
我在c# Dot Net Core中有一个典型的API,在接收$.getJSON(apiUrl)
的ajax
请求时返回订单列表,如下所示:
$.getJSON("api/Orders")
.done(function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, item) {
// Add a list item for the product.
$('<li>', { text: formatItem(item) }).appendTo($('#products'));
});
});
我的控制器简单如下:
public class OrdersController
{
[HttpGet("api/Orders")]
public object Orders()
{
return new
{
.
.
};
}
}
以上对我来说很好。
我的问题是,如果用户在浏览器中输入一个url,如:http://localhost/api/Orders
,他将得到相同的输出,我想防止。
。我需要允许仅通过ajax
访问我的API,并且需要防止(或取消或重定向)它,如果通过浏览器地址行中的navigation
接收。
谢谢
您将无法禁止导航请求。
你真正能做的就是检查特定的头,表明这是一个AJAX请求。像X-Requested-With。但是任何基本的http客户端都允许人们添加它
感谢所有的点击,我通过创建middleware
解决了这个问题,如下所示:
- 创建文件夹
Middleware
-
在这个新文件夹中,我创建了两个文件
MiddleWalewareExtensions.cs
和RequestHeaderMiddleware.cs
-
MiddleWalewareExtensions.cs
是定义我们所有中间件的一个,在这个例子中它只是一个,代码是:using Microsoft.AspNetCore.Builder; // for IApplicationBuilder namespace myApp.Middleware { public static class MiddlewareExtensions { public static IApplicationBuilder UseRequestHeaderMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestHeaderMiddleware>(); } ... here you can define others
}}
-
RequestHeaderMiddleware
是中间件,检查url是否包含单词api
,只有当头包含user-key
并且该键是有效的时才执行,否则返回错误。如果链接不包含API字,则执行时不带需要用户密钥using Microsoft.AspNetCore.Http; using System.Threading.Tasks; namespace myApp.Middleware { public class RequestHeaderMiddleware { private readonly RequestDelegate _next; public RequestHeaderMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { string url = context.Request.Path; if (url.Contains("api") && !context.Request.Headers.Keys.Contains("user-key")) { context.Response.StatusCode = 400; //Bad Request await context.Response.WriteAsync("You need a user key to be able to access this API.."); return; } else { if(context.Request.Headers["user-key"] != "28236d8ec201df516d0f6472d516d72d") { context.Response.StatusCode = 401; //UnAuthorized await context.Response.WriteAsync("Invalid User Key"); return; } } await _next.Invoke(context); } } }
在
Startup.cs
文件中添加using myApp.Middleware;
然后:public void Configure(IApplicationBuilder app) { app.UseRequestHeaderMiddleware(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
在JavaScript
client app
中添加xmlhttp
所需的标头,如:xmlhttp.setRequestHeader("user-key", "28236d8ec201df516d0f6472d516d72d");